Правильно отключить рекламу AdMob - PullRequest
36 голосов
/ 28 декабря 2010

Я интегрирую AdMob в свое приложение, и мне интересно, как правильно отключить рекламу.Я хочу дать пользователю возможность отключить их.Я не хочу никаких проблем с AdMob из-за неправильных показов.Это правильно, или я должен рассмотреть что-то?

AdView ads = (AdView) findViewById(R.id.ad);
ads.setEnabled(false);

Ответы [ 9 ]

34 голосов
/ 19 января 2011

В вашем файле макета (например, main.xml):

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/adsContainer">

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

</LinearLayout>

Затем в вашем коде (например, внутри блока if)

(LinearLayout) adscontainer = (LinearLayout) findViewById(R.id.adsContainer);

View admobAds = (View) findViewById(R.id.admobAds);

adscontainer.removeView(admobAds);

Это «навсегда» (в течение жизненного цикла приложения) удалит рекламу из Layou, что означает, что не будет запрашиваться никаких объявлений.

27 голосов
/ 03 января 2012

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

Во всяком случае, я обрисовал, как я это сделал в этой статье .Статья более подробно, но вот соответствующие части:

Код, который я использую, чтобы отключить рекламу:

private void hideAd() {
    final AdView adLayout = (AdView) findViewById(R.id.adView1);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            adLayout.setEnabled(false);
            adLayout.setVisibility(View.GONE);
        }
    });
}

И включить их снова (в случае, если кто-то чувствовал себя щедрым)

private void showAd() {
    final AdView adLayout = (AdView) findViewById(R.id.adView1);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            adLayout.setEnabled(true);
            adLayout.setVisibility(View.VISIBLE);
            adLayout.loadAd(new AdRequest());
        }
    });
}
3 голосов
/ 09 сентября 2015

К сожалению, комбинация setVisibility(View.GONE); + setEnabled(false) не работает универсально на всех версиях / устройствах Android. В зависимости от того, когда вы вызываете его, вы можете оказаться на пустом экране (без NPE, только с пустым экраном).

Пока единственное решение, которое работает для меня:

Для активности:

protected void removeAdView(int adViewId) {
    View view = getWindow().getDecorView();
    View adView = view.findViewById(adViewId);

    if (adView != null) {
        ViewGroup parent = (ViewGroup) adView.getParent();
        parent.removeView(adView);
        parent.invalidate();
    }
}

Для фрагмента:

protected void removeAdView(View topView, int adViewId) {
    View adView = topView.findViewById(adViewId);

    if (adView != null) {
        ViewGroup parent = (ViewGroup) adView.getParent();
        parent.removeView(adView);
        parent.invalidate();
    }
}

Это решение основано на ответе @ Quartertone, но расширено до более универсального (т.е. работает со всеми ViewGroup не только LinearLayout). Просто поместите эти методы в ваши базовые классы Activity / Fragment.

3 голосов
/ 14 августа 2011
  1. Создайте новый класс, полученный из AdView;

    package com.MyApp;
    
    import android.app.Activity;
    import android.content.Context;
    import android.util.AttributeSet;
    
    import com.google.ads.AdRequest;
    import com.google.ads.AdSize;
    
    public class MyAdView extends com.google.ads.AdView {
    
    public MyAdView(Activity activity, AdSize adSize, String adUnitId) {
        super(activity, adSize, adUnitId);
        if (MyApp.m_ads_enabled) {
            AdRequest adRequest = new AdRequest();
               loadAd(adRequest);
        }
    }
    
    public MyAdView(Context context, AttributeSet attrs) 
    {
        super(context, attrs); 
        if (MyApp.m_ads_enabled) {
            AdRequest adRequest = new AdRequest();
               loadAd(adRequest);
        }
    }
    
    MyAdView(Context context, AttributeSet attrs, int defStyle) 
    {
        super(context, attrs, defStyle);
        if (MyApp.m_ads_enabled) {
            AdRequest adRequest = new AdRequest();
               loadAd(adRequest);
        }
    }
    
  2. в вашем XML, чтобы определить вашу рекламу, используя MyAdView вместо обычных AdView иустановите для атрибута loadAdOnCreate значение false, например;

<com.MyApp.MyAdView android:id="@+id/adView"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         ads:adUnitId="0"
                         ads:adSize="BANNER"
                         ads:loadAdOnCreate="false"/>

Затем, в зависимости от значения MyApp.m_ads_enabled при вызове setContentView()объявления будут либо отключены, либо включены.

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

1 голос
/ 14 октября 2017

Достаточно просто установить видимость представления GONE .

Если вы прочитаете вывод Logcat, он напечатает "I / Ads: объявление не видно.. ".

1 голос
/ 31 мая 2017

Дайте все, что у вас есть, просто чтобы быть в безопасности:

if (mAdView != null) {
    mAdView.setEnabled(false);
    mAdView.setVisibility(View.GONE);

    ViewGroup parent = (ViewGroup) mAdView.getParent();
    if (parent != null) parent.removeView(mAdView);

    mAdView.removeAllViews();
    mAdView.destroy();
}
1 голос
/ 29 декабря 2010

setVisibility (VIEW.GONE);удалит объявление из макета.

Возможно, удастся полностью удалить его из макета, но мне никогда не приходилось это делать.

0 голосов
/ 05 ноября 2016

Создайте класс, который называется Ads как это

`public class Ads { публичное статическое логическое шоу (AdView mAdView) {

    if(mAdView != null){
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);
        return true;
    }
    return false;
    }
public static void Remove(AdView mAdView,ViewGroup parent){
    root.removeView(mAdView);
    }
public static void Remove(AdView mAdView,RelativeLayout mLayout){
    mLayout.removeView(mAdView);
    }
public static void Remove(AdView mAdView, LinearLayout mLayout){
    mLayout.removeView(mAdView);
    }
  }

Теперь импортируйте его в класс, из которого вы хотите удалить AdView из использовать Ads.Remove(AdView, parent); удалить это. Ads.Remove("the add view itself", the ViewGroup or layout where it is");

0 голосов
/ 09 июня 2011

Я не уверен, перекомпоновывается ли макет после удаления рекламы; если это не так, вы можете создать идентичный (за исключением отсутствующего объявления) макет. В вашем OnCreate выберите правильный макет. Затем вам просто нужно убедиться, что изменение конфигурации инициируется после того, как пользователь сделает выбор (это может произойти уже в зависимости от того, как вы позволили ему выбрать - например, вернуться с экрана настроек).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...