2010-10-23 5 views

Antwort

20

Hier ist eine einfachere Lösung: Erstellen Sie einen neuen Einstellungstyp, der eine einzelne Anzeige anzeigt. Sie können diesen Präferenztyp dann in die XML-Definition für Ihre Einstellungen aufnehmen, um eine oder mehrere Anzeigen anzuzeigen.

Individuelle Vorlieben Klasse:

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-Layout für 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> 

Und dann fügen Sie einfach so etwas wie dies in Ihre Präferenzen XML-Definition:

<?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> 
+1

Es sieht so aus, als würde die Anzeige mit dem Rest der Liste der Einstellungen scrollen. – pmont

1

Sie können eine Einstellungs implementieren auf zwei Arten screenen:

  1. Verwenden Sie die Rahmeneinstellungen so, dass die XML-Einstellungsdatei erzeugt automatisch die Einstellungen Layout und alle seine Funktionalität
  2. schreiben die Aktivität selbst, dh beim Laden zeigen Sie die aktuellen Einstellungen, wie sie angezeigt werden, speichern Sie sie unter Verwendung einer normalen XML-Layoutdatei, die Sie erstellen

Ich vermute, dass Sie das AdMob-Objekt zu einer XML-Datei hinzufügen, die es nicht verarbeiten kann, und nur Einstellungselemente behandeln können. Bitte posten Sie Ihre XML-Datei und geben Sie an, welcher Casting-Fehler angezeigt wird.

Wenn Sie die Kontrolle über den Inhalt des Einstellungsbildschirms haben wollen, dann implementieren Sie es selbst als normale Aktivität, und dann können Sie alles tun, was Sie wollen.

3

Ich habe es geschafft, dies für mich selbst zu beantworten, also werde ich die Lösung hier für den Fall, dass jemand anderes die gleiche Frage hat.

Ich habe eine TabActivity sowie die Standard Einstellungen hinzugefügt und dann die Einstellungen in eine Tab der TabActivity verschachtelt. Das bedeutet, dass ich ein normales Layout-XML für die TabActivity-Komponente habe, in das ich eine Adview (oder eine andere Art von View) einfügen kann, und ich habe immer noch den Bildschirm für generierte Einstellungen, der darin arbeitet.

-Code für den 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);  
    } 
} 

-Code für die 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> 

Einstellung android: Sichtbarkeit = "unsichtbar" und android: layout_height = "1 dp" auf dem TabWidget Tag bedeutet, dass die Benutzer kann nicht sagen, es ist eigentlich ein Tab

+0

Danke. Sehen Sie sich dies an, um die Anzeige unten zu platzieren: http://stackoverflow.com/questions/8583861/adding-adview-below-tabhost-in-xml – pmont

2

Danke Ich habe wirklich danach gesucht.

Nur eine Warnung: Wenn Sie diesen Ansatz für Produktionscode verwenden und Sie verwenden proguard müssen Sie proguard sagen, nicht die Klasse AdmobPreference zu codieren, da sonst der Inflator FC.

Fügen Sie diese Zeile in proguard.cfg:

-keep public class * extends android.preference.Preference 
2

Für diejenigen fragen, wie dies zu implementieren mit einem PreferenceFragment, hier ist eine Lösung, gibt es keine Notwendigkeit, eine benutzerdefinierte Preference zu erstellen:

erstellen Sie zunächst ein neues Layout (hier namens settings.xml im Layout Ressourcen-Ordner), die im PreferenceFragment aufgeblasen wird:

<?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> 

Verwenden Sie dann dieses Layout in den PreferenceFragment, es in der onCreateView Methode laden:

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

Vergessen Sie nicht, den folgenden Code für die neue Version von AdMob mit Google Play-Dienste hinzufügen:

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

Durch die Erstellung einer benutzerdefinierten Einstellung können Sie Anzeigen einfach zwischen Einstellungen/anderen Einstellungen einfügen. Während Ihre Lösung nur erlaubt, eine Anzeige am unteren oder oberen Rand der Einstellungen zu platzieren. –

+0

Ja, ich stimme zu, aber die Frage ist, nach einer Lösung zu suchen, um die Anzeige an die Spitze zu setzen, und das ist es, was mein Code tut. –

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