2010-10-23 3 views
7

Я видел, что в живых экранах Марио используются объявления admob на экране настроек, но я не смог сделать это сам. Если я разместил объявление в файле settings.xml, как и в обычном макете, я получаю исключение класса.Как разместить рекламное объявление admob на экране настроек для живых обоев?

Вот скриншот марио живых обоев, чтобы проиллюстрировать то, что я пытаюсь сделать.

example screenshot

ответ

20

Вот более простое решение: создайте новый тип предпочтений, который отображает одно объявление. Затем вы можете включить этот тип предпочтений в определение xml для своих предпочтений для отображения одной или нескольких объявлений.

Пользовательские предпочтения Класс:

public class AdmobPreference extends Preference 
{ 

    public AdmobPreference(Context context) { 
     super(context, null); 
    } 

    public AdmobPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected View onCreateView(ViewGroup parent) { 
      //override here to return the admob ad instead of a regular preference display 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     return inflater.inflate(R.layout.admob_preference, null); 
    } 

} 

XML Layout для AdmobPreference:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:myapp="http://schemas.android.com/apk/res/<YOUR PACKAGE>" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
> 

    <com.google.ads.AdView android:id="@+id/ad" android:layout_width="fill_parent" 
     android:layout_height="wrap_content" myapp:backgroundColor="#000000" myapp:primaryTextColor="#FFFFFF" 
     myapp:secondaryTextColor="#CCCCCC" /> 
</LinearLayout> 

И тогда вы просто добавить что-то подобное в ваши предпочтения определение XML:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
android:orderingFromXml="true"> 

    <YOUR PACKAGE NAME.AdmobPreference android:key="ad" /> 

    ... other preferences ... 
</PreferenceScreen> 
+1

Похоже, это заставит объявление прокручиваться вместе с остальным списком предпочтений. – pmont

1

Вы можете осуществить настройки экрана двумя способами:

  1. Использование рамки предпочтений, так что XML-файл настроек автоматически создает макет предпочтения и все его функциональные возможности
  2. Написать или, например, при загрузке, покажите текущие настройки, как они показаны, сохраните их, используя созданный вами файл XML нормального макета

Я подозреваю, что вы добавляете объект AdMob в XML-файл, который не может его обработать, и он может обрабатывать элементы предпочтения onlky. Отправьте свой XML-файл и укажите, какую ошибку вы видите.

Если вы хотите получить максимальный контроль над содержимым экрана настроек, тогда реализуйте его как обычную деятельность, а затем вы можете делать все, что хотите.

3

Мне удалось ответить на этот вопрос для себя, поэтому я отправлю решение здесь, если у кого-то будет тот же вопрос.

Я добавил TabActivity, а также стандартную активность Preferences, а затем вложил Preferences внутри Tab TabActivity. Это означает, что у меня есть обычный макет xml для TabActivity, в котором я могу разместить объявление (или любой другой вид) внутри, и у меня все еще есть экран сгенерированных настроек, который работает в этом.

Код для TabActivity

public class SettingsTabActivity extends TabActivity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tablayout); 

     TabHost tabHost = getTabHost(); // The activity TabHost 
     TabHost.TabSpec spec; // Resusable TabSpec for each tab 
     Intent intent; // Reusable Intent for each tab 

     // Create an Intent for the regular live wallpaper preferences activity 
     intent = new Intent().setClass(this, Preferences.class); 

     // Initialize a TabSpec and set the intent 
     spec = tabHost.newTabSpec("TabTitle").setContent(intent); 
     spec.setIndicator("TabTitle"); 

     tabHost.addTab(spec); 

     tabHost.setCurrentTab(0);  
    } 
} 

Код для tablayout.xml

<?xml version="1.0" encoding="utf-8"?> 

<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:myapp="http://schemas.android.com/apk/res/*your package name goes here for admob*" 
    android:id="@android:id/tabhost" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout android:orientation="vertical" 
      android:layout_width="fill_parent" android:layout_height="fill_parent"> 

      <com.admob.android.ads.AdView android:id="@+id/ad" 
        android:layout_width="fill_parent" android:layout_height="wrap_content" 
        myapp:backgroundColor="#000000" myapp:primaryTextColor="#FFFFFF" 
        myapp:secondaryTextColor="#CCCCCC" /> 

      <TabWidget android:id="@android:id/tabs" 
        android:layout_width="fill_parent" android:layout_height="1dp" 
        android:tabStripEnabled="false" android:visibility="invisible" /> 

      <FrameLayout android:id="@android:id/tabcontent" 
        android:layout_width="fill_parent" android:layout_height="fill_parent" 
        android:padding="1dp" /> 
    </LinearLayout> 
</TabHost> 

Настройка андроида: видимость = "невидимый" и андроид: layout_height = "1 dp" на бирке TabWidget означает пользователь не может сказать, что это фактически таб.

+0

Спасибо. См. Это для размещения объявления внизу: http://stackoverflow.com/questions/8583861/adding-adview-below-tabhost-in-xml – pmont

2

Спасибо , Я действительно искал это.

Просто предупреждение: если вы используете этот подход для производственного кода и используете proguard, вам нужно сообщить proguard, чтобы он не кодировал класс AdmobPreference, иначе инфлятор будет FC.

Добавить эту строку в proguard.cfg:

-keep public class * extends android.preference.Preference 
2

Для тех, кому интересно, как это реализовать с PreferenceFragment, здесь есть решение, нет необходимости создавать пользовательские Preference:

Сначала создайте новый макет (здесь названный settings.xml в папке компоновки ресурсов), которые будут раздувать в PreferenceFragment:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_height="match_parent" 
       android:layout_width="match_parent"> 

    <com.google.android.gms.ads.AdView 
      xmlns:ads="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/adview" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      ads:adUnitId="XXXXX" 
      ads:adSize="SMART_BANNER" 
      android:layout_alignParentTop="true" /> 

    <ListView android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/adview" /> 

</RelativeLayout> 

Затем используйте этот макет в PreferenceFragment, загрузите его в onCreateView метод:

private AdView adView; 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.settings, null); 

     adView = (AdView)v.findViewById(R.id.adview); 

     //** Adview */ 
     if(Tools.isNetworkConnected(getActivity())){ 
      adView.setVisibility(View.VISIBLE); 
     } 
     else{ 
      adView.setVisibility(View.GONE); 
     } 

     //Create ad banner request 
     AdRequest adBannerRequest = new AdRequest.Builder() 
//  .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
//  .addTestDevice("XXXXX") 
     .build(); 

     // Begin loading banner 
     adView.loadAd(adBannerRequest); 

     return v; 
    } 

Не забудьте добавить следующий код для новой версии Admob с помощью Google Play услуги:

@Override 
    public void onResume() { 
     super.onResume(); 
     if(adView != null){ 
      adView.resume(); 
     } 
    } 

    @Override 
    public void onPause() { 
     if(adView != null){ 
      adView.pause(); 
     } 
     super.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     if(adView != null){ 
      adView.destroy(); 
     } 
     super.onDestroy(); 
    } 
+0

Создание пользовательских настроек позволяет легко вставлять объявления между настройками и другими настройками. В то время как ваше решение позволяет размещать рекламу в нижней или верхней части настроек. –

+0

Да, я согласен, но вопрос заключается в том, чтобы задать решение для размещения объявления в верхней части страницы, и это то, что делает мой код. –

0
@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     ViewGroup linear = (ViewGroup) view; 
     while (!(linear instanceof LinearLayout)) 
      linear = (ViewGroup) linear.getParent(); 
     AdView adView = new AdView(); 
     linear.addView(adFrame); 
    } 
Смежные вопросы