Как поместить AdMob AdWord на экране настроек для живых обоев?
Я видел, что живые обои Mario используют рекламные объявления на экране настроек, но я не смог сделать это сам. Если я добавлю объявление в файл settings.xml, как при обычной компоновке, я получу исключение приведения класса.
Вот скриншот живых обоев Марио, чтобы проиллюстрировать, что я пытаюсь сделать.
6 ответов
Вот более простое решение: создайте новый тип предпочтений, который отображает одно объявление. Затем вы можете включить этот тип предпочтений в определение 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, затем вложил 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" и android:layout_height="1dp" в теге TabWidget означает, что пользователь не может сказать, что это на самом деле Tab
Спасибо, я действительно искал это.
Просто предупреждение: если вы используете этот подход для производственного кода и используете 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();
}
Вы можете реализовать экран настроек двумя способами:
- Используйте структуру предпочтений, чтобы файл настроек XML автоматически создавал макет настроек и все его функции.
- Напишите упражнение самостоятельно, т.е. при загрузке покажите текущие настройки, как они отображаются, сохраните их, используя созданный вами обычный XML-файл макета.
Я подозреваю, что вы добавляете объект AdMob в XML-файл, который не может его обработать и может обрабатывать только элементы предпочтений. Пожалуйста, опубликуйте свой 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);
}