2010-12-28 5 views
29

Ich integriere AdMob in meine App und frage mich, wie ich Anzeigen korrekt deaktivieren kann. Ich möchte dem Benutzer die Möglichkeit geben, sie zu deaktivieren. Ich möchte wegen falscher Impressionen keine Probleme mit AdMob bekommen. Ist dieser Weg richtig oder sollte ich etwas in Betracht ziehen?AdMob-Anzeigen richtig deaktivieren

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

Warten. Sie verdienen Geld mit Anzeigen und Sie lassen den Benutzer sie deaktivieren, wenn sie möchten? Oder müssen sie bezahlen, um Anzeigen zu deaktivieren? –

+21

Ich möchte mit den Anzeigen kein Geld verdienen. Aber ich möchte dem Nutzer die Möglichkeit geben, die weitere Entwicklung von Apps durch Anzeigen der Anzeigen zu unterstützen. – Mark

Antwort

27

In Ihrer Layout-Datei (zB 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> 

dann in Ihrem Code (zB in einem "if" Block)

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

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

adscontainer.removeView(admobAds); 

Dies wird "permanent" (für den Lebenszyklus der App) entfernen Sie die Anzeigen aus dem Layout, was bedeutet, dass keine Anzeigen angefordert werden.

+0

ja, aber wenn ich ein XML-Layout verwende, wie füge ich es zurück? – max4ever

+0

@ max4ever fügen Sie die Ansicht nur dann programmatisch hinzu, wenn Sie dies benötigen (oder fügen Sie ein Layout nur mit der Ansicht adview hinzu und blähen Sie es programmatisch im viewgroup-Container auf). Ich schätze, das Hinzufügen/Entfernen sollte nicht so oft aufgerufen werden, sonst ist es viel einfacher, die Sichtbarkeit einfach auf "weg"/"sichtbar" zu setzen.Wenn es nur ein paar Mal aufgerufen wird, dann fügen Sie es programmatisch hinzu und nehmen Sie es wie oben beschrieben ab. – RJFares

1

setVisibility (VIEW.GONE); Entfernt die Adview aus dem Layout.

Es könnte weg sein, es vollständig aus dem Layout zu entfernen, aber ich musste das nie tun.

0

Ich bin mir nicht sicher, ob das Layout nach dem Entfernen der Adview neu fließt. Ist dies nicht der Fall, können Sie ein identisches Layout (mit Ausnahme der fehlenden Anzeige) erstellen. Wählen Sie in Ihrem OnCreate das richtige Layout. Dann müssen Sie nur sicherstellen, dass eine Konfigurationsänderung ausgelöst wird, nachdem der Benutzer die Auswahl getroffen hat (möglicherweise bereits geschehen, abhängig davon, wie Sie sie auswählen lassen - z. B. von einem Einstellungsbildschirm zurückkehren).

3
  1. Erstellen Sie eine neue Klasse, die von AdView abgeleitet ist;

    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. in Ihrer XML-Veröffentlichung Ihrer Anzeige definieren mit MyAdView anstatt der regulären AdView und stellen Sie die loadAdOnCreate Attribut false, z .;

<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"/> 

Dann je nach dem Wert von MyApp.m_ads_enabled, wenn Sie anrufen setContentView() die Anzeigen werden entweder gesperrt oder freigegeben werden.

Dieser Ansatz hat den Vorteil, dass bei deaktivierten Anzeigen keine Datenbandbreite verwendet wird, da die Anzeige nie angefordert wird. Dies kann für einen eingeschränkten oder PAYG-Datenvertrag wichtig sein.

+0

Es funktioniert für mich :) Danke – MBH

25

Ich wollte auch Benutzern die Möglichkeit geben, Anzeigen zu deaktivieren - warum zwingt Menschen, sie zu sehen, wenn sie nicht wollen? und warum sollten Sie erwarten, dass die Leute für diese Option bezahlen?

Wie auch immer, ich skizzierte, wie ich das in this article tat.Der Artikel geht mehr ins Detail, aber hier ist die relevanten Teile:

Der Code i-Anzeigen deaktivieren verwenden:

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); 
     } 
    }); 
} 

Und sie auf zurück zu drehen (falls jemand fühlte sich großzügig)

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()); 
     } 
    }); 
} 
+1

Ist Sichtbarkeit Änderung genug? Wenn die Sichtbarkeit GONE festgelegt wird, bleibt das Ansichtsobjekt weiterhin aktiv. Es ist kostenlos, Anzeigenanfragen, Aktualisierungen usw. zu bearbeiten. Das Entfernen der Ansicht ist ein besserer Ansatz. – rpattabi

0

Ich hätte dies als Kommentar zu Quartertones Antwort hinzugefügt, aber habe keine 50 Bewertung: Ich glaube nicht, dass dies die Anzeigen dauerhaft deaktiviert. Ich habe den folgenden Schalter verwendet, um sie ein- und auszuschalten, wann immer Sie möchten. Auf der einen Seite deaktiviere ich die Anzeigen in der Ansicht und mit der anderen die Anzeigen füllen ...

if (AdsNeeded) 
    { 
     AdRequest adRequest = new AdRequest.Builder() 
     .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
     .addTestDevice("ABC1234567890ABC1234567890") 
     .build(); 

     AdView adMobAds = (AdView) this.findViewById(R.id.adMobAds); 
     adMobAds.loadAd(adRequest); 

    } 
    else 
    { 
     LinearLayout adsContainer = (LinearLayout)findViewById(R.id.adsContainer); 

     AdView adMobAds = (AdView) this.findViewById(R.id.adMobAds); 
     adsContainer.removeView(adMobAds); 

    } 
2

Leider ist die setVisibility(View.GONE); + setEnabled(false) Combo auf allen Android-Versionen/Geräte nicht überall funktioniert. Je nachdem, wann Sie es aufrufen, können Sie am leeren Bildschirm hängen bleiben (keine NPE, nur leerer Bildschirm).

Bisher ist die einzige Lösung, die funktioniert für mich ist:

Für Aktivität:

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(); 
    } 
} 

Für Fragment:

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(); 
    } 
} 

Diese Lösung auf @ Quartertone Antwort beruht, sondern erweitert universeller sein (dh funktioniert mit allen ViewGroup s nicht nur LinearLayout). Stellen Sie diese Methoden einfach in Ihre Basis-Aktivitäts-/Fragmentklassen.

0

eine Klasse machen, die Ads ähnliche

`public class Anzeigen { public static boolean Show (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); 
    } 
    } 

Nun ist es in der Klasse importieren, wo Sie wollen, aufgerufen wird Entfernen Sie ein AdView von Verwenden Sie Ads.Remove(AdView, parent); , um es zu entfernen. Ads.Remove("the add view itself", the ViewGroup or layout where it is");

1

Gib alles was du hast, nur um auf der sicheren Seite zu sein:

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(); 
} 
0

nur die Sichtbarkeit der Ansicht Einstellung GONE genug ist.

Wenn Sie die Logcat-Ausgabe lesen, wird gedruckt "I/Ads: Die Anzeige ist nicht sichtbar. Die Anzeige wird nicht aktualisiert.".