Как разместить объявление adob на экране настроек для живых обоев?

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

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

Пример скриншота

Вот более простое решение: создайте новый тип предпочтений, который отображает одно объявление. Затем вы можете включить этот тип предпочтений в определение 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-макет для 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> 

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

Я добавил TabActivity, а также стандартную активность Preferences, а затем вложенные настройки внутри вкладки 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> 

Настройка android: visibility = "invisible" and android: layout_height = "1dp" в теге TabWidget означает, что пользователь не может сказать, что это фактически табуляция

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

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

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

 -keep public class * extends android.preference.Preference 

Для тех, кто задается вопросом, как реализовать это с помощью 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(); } 

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

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

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

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

  @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); } 
Intereting Posts
Android ProGuard: самые агрессивные оптимизации Используйте постоянное уведомление, чтобы позволить пользователю вернуться к запущенному приложению Android. Заполняется ли в viewviewport пользователя horizontalscrollview прокрутка? Как получить элемент из дочернего элемента в ExpandableListView? Может ли PostMessage API использоваться для связи с Android WebView? Как сбросить фоновый цвет кнопки по умолчанию? Общий класс, расширяющий класс и реализующий интерфейс Данные Android POST с регистрационными данными для файла php – https Android x86 porting, неспособный заставить его работать Android: обнаружение, когда SD-карта установлена ​​как диск на компьютер TextView setTextColor () не работает MPAndroidChart, как установить цвет ярлыка? Ionic 2 построил приложение (IOS, Android) медленно при загрузке Почему «Избегайте перечислений, где вам нужны только инты», удалены из подсказок производительности Android? Как игнорировать аннотацию @JavascriptInterface со строками в API 17 -Android