Как поместить admob adview на экран настроек для живых обоев? - PullRequest
8 голосов
/ 23 октября 2010

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

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

example screenshot

Ответы [ 6 ]

20 голосов
/ 15 января 2011

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

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

Я добавил 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

2 голосов
/ 18 марта 2014

Для тех, кто интересуется, как реализовать это с 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();  
    }
2 голосов
/ 26 января 2011

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

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

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

-keep public class * extends android.preference.Preference
1 голос
/ 25 октября 2010

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

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

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

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

0 голосов
/ 04 ноября 2016
    @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);
    }
...