2010-10-23 12 views
7

He visto el fondo de pantalla en vivo de Mario usa anuncios admob en la pantalla de configuración, pero no he podido hacerlo yo mismo. Si pongo la vista de visita en el archivo settings.xml como lo harías con un diseño normal, recibo una excepción de clase.¿Cómo coloco un adview de AdMob en la pantalla de configuración para un fondo de pantalla en vivo?

Aquí hay una captura de pantalla del fondo de pantalla en vivo de mario para ilustrar lo que estoy tratando de hacer.

example screenshot

Respuesta

20

Aquí hay una solución más simple: cree un nuevo tipo de preferencia que muestre un solo anuncio. A continuación, puede incluir ese tipo de preferencia en la definición xml para sus preferencias para mostrar uno o más anuncios.

personalizada Clase Preferencia:

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

} 

Disposición XML para 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> 

Y a continuación, sólo tiene que añadir algo como esto en las preferencias de definición 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> 
+1

Parece que esto haría que el anuncio de desplazamiento con el resto de la lista de preferencias. – pmont

1

Puede implementar una pantalla de configuración de dos maneras:

  1. Uso del marco preferencias para que el archivo de preferencias XML automáticamente crea el trazado preferencias y toda su funcionalidad
  2. escribir el Actividad usted mismo, es decir, al cargar, muestre las preferencias actuales, tal como se muestran, guárdelas, utilizando un archivo XML de diseño normal que cree

Sospecho que está agregando el objeto de AdMob a un archivo XML que no puede manejarlo, y puede manejar onlky los elementos de preferencia. Publique su archivo XML y especifique qué error de conversión está viendo.

Si desea un control máximo sobre el contenido de la pantalla de preferencias, impleméntelo usted mismo como una actividad normal, y luego puede hacer lo que quiera.

3

He logrado responder esto por mí mismo así que publicaré la solución aquí en caso de que alguien más tenga la misma pregunta.

Agregué una TabActivity así como la actividad de Preferencias estándar, luego anidé las Preferencias dentro de una pestaña de TabActivity. Esto significa que tengo un xml de diseño normal para TabActivity en el que puedo poner una vista de anuncio (o cualquier otro tipo de vista) dentro y todavía tengo la pantalla de preferencias generadas trabajando dentro de eso.

Código para la 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);  
    } 
} 

Código para la 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> 

Configuración de Android: la visibilidad = "invisible" y android: layout_height = "1DP" en la etiqueta significa que el TabWidget el usuario no puede decir que en realidad es una pestaña

+0

Gracias. Ver esto para colocar el anuncio en la parte inferior: http://stackoverflow.com/questions/8583861/adding-adview-below-tabhost-in-xml – pmont

2

Gracias , Realmente estaba buscando esto.

Solo una advertencia: si está utilizando este enfoque para el código de producción y está usando proguard, necesita decirle a proguard que no codifique la clase AdmobPreference; de ​​lo contrario, el inflador será FC.

Añadir esta línea a su proguard.cfg:

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

Para los que preguntan cómo implementar esto con un PreferenceFragment, aquí es una solución, no hay necesidad de crear una costumbre Preference:

en primer lugar crear un nuevo diseño (settings.xml aquí nombrado en la carpeta de recursos de diseño) que se infla en el 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> 

A continuación, usar la disposición en el PreferenceFragment, cargarlo en el onCreateView método:

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

No se olvide de añadir el siguiente código para la nueva versión de AdMob usando servicios de 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(); 
    } 
+0

La creación de una preferencia personalizada le permite insertar anuncios fácilmente entre ajustes/otras preferencias. Mientras que su solución solo permite colocar un anuncio en la parte inferior o superior de la configuración. –

+0

Sí, estoy de acuerdo, pero la pregunta es pedir una solución para poner el anuncio en la parte superior, y es lo que está haciendo mi código. –

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