El diseño de fragmentos de Android no se carga al mostrar un anuncio intersticial de Admob en OnCreateView
Tengo problemas con la visualización de anuncios en mi aplicación con AdMob. El problema es como se indica en el tema.
Esta es mi clase de actividad inicial:
- Analizando JSON en Java
- Robotium: ¿Cómo espero que termine la carga antes de continuar?
- Cuando se utiliza JSON en Fragmentos, la aplicación no responde en Android Development
- Android añadiendo pie de página a ListView addFooterView ()?
- En Java, ¿qué ocurre cuando se tiene un método con una palabra clave de visibilidad no especificada?
package com.example.admobinterstitial; import android.os.Bundle; import com.google.android.gms.ads.AdListener; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.InterstitialAd; import android.support.v4.app.FragmentActivity; import android.view.Window; import android.view.WindowManager; public class MainActivity extends FragmentActivity { public static InterstitialAd mInterstitialAd; @Override protected void onCreate(Bundle savedInstanceState) { // Super super.onCreate(savedInstanceState); // Turn off the window's title bar requestWindowFeature(Window.FEATURE_NO_TITLE); // Fullscreen mode getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId(getResources().getString(R.string.loading_add_id)); mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdClosed() { requestNewInterstitial(); } }); requestNewInterstitial(); if (findViewById(R.id.fragment_container) != null) { if (savedInstanceState != null) { return; } // Create a new Fragment to be placed in the activity layout Fragments.MenuFragment firstFragment = new Fragments.MenuFragment(); // In case this activity was started with special instructions from an // Intent, pass the Intent's extras to the fragment as arguments firstFragment.setArguments(getIntent().getExtras()); // Add the fragment to the 'fragment_container' FrameLayout getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, firstFragment, firstFragment.getClass().toString()).commit(); } } private void requestNewInterstitial() { AdRequest adRequest = new AdRequest.Builder() .addTestDevice("my test device ID blabla") .build(); mInterstitialAd.loadAd(adRequest); } }
Disposición de la actividad principal:
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <FrameLayout android:id="@+id/fragment_container" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/bg_color" > </FrameLayout> </RelativeLayout>
Aquí hay 2 fragmentos en mi aplicación:
package com.example.admobinterstitial; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; public class Fragments { public static class MenuFragment extends Fragment { Context mContext; @Override public void onAttach(Activity activity) { super.onAttach(activity); mContext = activity; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment final View rootView = inflater.inflate(R.layout.menu_fragment, container, false); Button myButton = (Button) rootView.findViewById(R.id.myButton); myButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { NextFragment newFragment = new NextFragment(); FragmentManager man = ((FragmentActivity)mContext).getSupportFragmentManager(); android.support.v4.app.FragmentTransaction transaction = man.beginTransaction(); transaction.replace(R.id.fragment_container, newFragment, newFragment.getClass().toString()); transaction.addToBackStack(null); transaction.commit(); } }); return rootView; } }; public static class NextFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment final View rootView = inflater.inflate(R.layout.next_fragment, container, false); //TODO After showing the ad here, views in my R.layout.next_fragment won't show up after closing the ad. //With those 2 lines commented, the views show up correctly... if (MainActivity.mInterstitialAd.isLoaded()) MainActivity.mInterstitialAd.show(); return rootView; } }; }
En MainActivity acabo de establecer mi R.id.fragment_container a mi MenuFragment. En MenuFragment tengo un botón que inicia NextFragment (reemplaza a R.id.fragment_container con este fragmento). El problema está en la clase NextFragment en OnCreateView …
Ya he pasado mucho tiempo tratando de resolver el problema y ahora estoy tan desesperada que incluso preparé un pequeño proyecto de eclipse de muestra que muestra el problema: https://drive.google.com/file/d/0ByRNGNhz- adOQ091OU15c3ZUckE / view? usp = compartir
Tendrás que cambiar tu ID de la unidad de anuncio en strings.xml y establecer tu ID de dispositivo de prueba en MainActivity.java en el método requestNewInterstitial para mostrar el anuncio … (y probablemente corregir algunos errores de enlace? estar vinculado correctamente para ustedes)
Y voy a dar recompensa a quien derrame alguna luz para resolver el problema …
actualización 1: En uno de mis dispositivos – samsung galaxy s4 mini – el problema ocurre no importa si uso anuncios de prueba o anuncios reales. Pero parece que en mi otro dispositivo LG-D320n el problema parece ocurrir sólo cuando se utilizan anuncios de prueba … Estoy totalmente confundido ahora …
actualización 2: agregando el logcat completo de la aplicación (no hay ningún fallo en la aplicación, pero muchos mensajes lanzados.Después de cerrar el adevertisement no hay vistas y salgo manualmente de la aplicación mediante "botón de nuevo")
11-05 13:26:13.018: W/GooglePlayServicesUtil(15088): Google Play services out of date. Requires 8115000 but found 5084034 11-05 13:26:13.018: W/Ads(15088): Using InterstitialAdManager from the client jar. 11-05 13:26:13.018: I/Ads(15088): Starting ad request. 11-05 13:26:13.068: W/GooglePlayServicesUtil(15088): Google Play services out of date. Requires 8115000 but found 5084034 11-05 13:26:13.068: E/GooglePlayServicesUtil(15088): GooglePlayServices not available due to error 2 11-05 13:26:13.108: I/ActivityManager(15088): Timeline: Activity_idle id: android.os.BinderProxy@4205cbf0 time:107329054 11-05 13:26:13.188: I/Ads(15088): Not on service, return 11-05 13:26:13.488: I/chromium(15088): [INFO:CONSOLE(0)] "Document was loaded from Application Cache with manifest https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.appcache", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:13.498: I/chromium(15088): [INFO:CONSOLE(0)] "Application Cache Checking event", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:13.498: I/chromium(15088): [INFO:CONSOLE(0)] "Application Cache Checking event", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:13.498: I/chromium(15088): [INFO:CONSOLE(0)] "Application Cache NoUpdate event", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:13.498: I/chromium(15088): [INFO:CONSOLE(0)] "Application Cache NoUpdate event", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:13.968: D/dalvikvm(15088): GC_FOR_ALLOC freed 1811K, 26% free 9199K/12400K, paused 52ms, total 52ms 11-05 13:26:14.038: W/AwContents(15088): nativeOnDraw failed; clearing to background color. 11-05 13:26:14.148: I/chromium(15088): [INFO:async_pixel_transfer_manager_android.cc(56)] Async pixel transfers not supported 11-05 13:26:14.218: I/chromium(15088): [INFO:async_pixel_transfer_manager_android.cc(56)] Async pixel transfers not supported 11-05 13:26:14.458: I/Ads(15088): Ad finished loading. 11-05 13:26:15.778: I/ViewRootImpl(15088): ViewRoot's Touch Event : Touch Down 11-05 13:26:15.898: I/ViewRootImpl(15088): ViewRoot's Touch Event : Touch UP 11-05 13:26:15.958: D/dalvikvm(15088): GC_FOR_ALLOC freed 2271K, 41% free 7316K/12400K, paused 31ms, total 32ms 11-05 13:26:16.308: I/ActivityManager(15088): Timeline: Activity_launch_request id:com.example.admobinterstitial time:107332251 11-05 13:26:16.318: I/Ads(15088): Ad opening. 11-05 13:26:16.378: D/dalvikvm(15088): GC_FOR_ALLOC freed 1553K, 40% free 7450K/12400K, paused 23ms, total 23ms 11-05 13:26:16.418: I/chromium(15088): [INFO:async_pixel_transfer_manager_android.cc(56)] Async pixel transfers not supported 11-05 13:26:16.488: I/chromium(15088): [INFO:async_pixel_transfer_manager_android.cc(56)] Async pixel transfers not supported 11-05 13:26:16.738: I/ActivityManager(15088): Timeline: Activity_idle id: android.os.BinderProxy@41f92ef0 time:107332684 11-05 13:26:18.418: I/ViewRootImpl(15088): ViewRoot's Touch Event : Touch Down 11-05 13:26:18.478: I/ViewRootImpl(15088): ViewRoot's Touch Event : Touch UP 11-05 13:26:18.508: I/Ads(15088): Starting ad request. 11-05 13:26:18.578: I/ActivityManager(15088): Timeline: Activity_idle id: android.os.BinderProxy@4205cbf0 time:107334523 11-05 13:26:18.648: I/Ads(15088): Not on service, return 11-05 13:26:18.748: I/chromium(15088): [INFO:CONSOLE(0)] "Document was loaded from Application Cache with manifest https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.appcache", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:18.748: I/chromium(15088): [INFO:CONSOLE(0)] "Application Cache Checking event", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:18.758: I/chromium(15088): [INFO:CONSOLE(0)] "Application Cache Checking event", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:18.878: D/dalvikvm(15088): GC_FOR_ALLOC freed 593K, 29% free 8904K/12400K, paused 19ms, total 19ms 11-05 13:26:18.958: I/chromium(15088): [INFO:CONSOLE(0)] "Application Cache NoUpdate event", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:18.958: I/chromium(15088): [INFO:CONSOLE(0)] "Application Cache NoUpdate event", source: https://googleads.g.doubleclick.net/mads/static/mad/sdk/native/sdk-core-v40.html (0) 11-05 13:26:19.118: W/AwContents(15088): nativeOnDraw failed; clearing to background color. 11-05 13:26:19.248: I/chromium(15088): [INFO:async_pixel_transfer_manager_android.cc(56)] Async pixel transfers not supported 11-05 13:26:19.308: I/chromium(15088): [INFO:async_pixel_transfer_manager_android.cc(56)] Async pixel transfers not supported 11-05 13:26:19.358: I/Ads(15088): Ad finished loading. 11-05 13:26:21.348: I/ViewRootImpl(15088): ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x48, repeatCount=0, eventTime=107337287, downTime=107337287, deviceId=7, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{41e7ae60 VE.... R....... 0,0-480,800} 11-05 13:26:21.458: I/ViewRootImpl(15088): ViewRoot's KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x48, repeatCount=0, eventTime=107337403, downTime=107337287, deviceId=7, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{41e7ae60 VE.... R....... 0,0-480,800} 11-05 13:26:22.358: I/ViewRootImpl(15088): ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x48, repeatCount=0, eventTime=107338296, downTime=107338296, deviceId=7, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{41e7ae60 VE.... R....... 0,0-480,800} 11-05 13:26:22.468: I/ViewRootImpl(15088): ViewRoot's KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x48, repeatCount=0, eventTime=107338412, downTime=107338296, deviceId=7, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{41e7ae60 VE.... R....... 0,0-480,800}
- Simular clic de botón de Android mediante programación
- No se puede actualizar el widget android desde BroadcastReceiver
- LibGDX no ejecuta el método render ()
- ¿Cómo agrega encabezados HTTP personalizados a las pestañas personalizadas de Chrome?
- Agregue un botón dinámicamente a un LinearLayout en Android
- Android: redireccionar llamadas salientes
- ¿Cómo manejar múltiples oyentes de interacción de fragmentos en una actividad correctamente?
- Android Multitouch - Determina qué dedo levantado?
Trate de ajustar el código de su anuncio en un fragmento como este:
rootView.post( new Runnable() { @Override public void run() { if (MainActivity.mInterstitialAd.isLoaded()) MainActivity.mInterstitialAd.show(); } } );
Es posible que el anuncio intersticial dañe de algún modo el ciclo de vida de su fragmento.
O puede intentar experimentar con postDelayed(Runnable runnable, long delay);
y mostrar el anuncio con algún retraso correctamente establecido. Tal vez eso ayudaría.
¿Está utilizando Emulator para ejecutar su código o dispositivo?
switch (isGooglePlayServicesAvailable(this)) { case 2: //out date try { GooglePlayServicesUtil.getErrorDialog(2, this, 0).show(); } catch (Exception e) { e.printStackTrace(); } break; }
Esto activará un diálogo de actualización para que el usuario actualice los servicios de reproducción.
Creo que estás ejecutando tu aplicación con una versión inferior de Play service Library. actualizarlo y luego ejecutar su código.
Consulte https://groups.google.com/forum/#!topic/google-admob-ads-sdk/A_NpbD6leg0
Se está hosing usted mismo almacenando el intersticial como una estática en MainActivity. Nunca hagas eso.
En su lugar, debe pasar un mensaje de su fragmento a su actividad que contiene y debe ser responsable de mostrar el anuncio.
De lo contrario, es casi seguro que va a empezar a perder el recuerdo.
- Diapositiva de la imagen de Android viewPager de derecha a izquierda
- Compatibilidad con varios subdominios con Enlaces de aplicaciones