2727import android .view .ViewGroup ;
2828import android .widget .FrameLayout ;
2929import android .widget .ProgressBar ;
30+ import android .widget .LinearLayout ;
3031import android .content .res .ColorStateList ;
3132import android .graphics .Bitmap ;
3233import android .webkit .CookieManager ;
@@ -69,6 +70,8 @@ public class MainActivity extends Activity {
6970 private FusedLocationProviderClient fusedLocation ;
7071 private boolean backPressedOnce = false ;
7172 private final Handler backHandler = new Handler (Looper .getMainLooper ());
73+ /** Franja inferior reservada para el banner de AdMob (nunca superpuesto al contenido). */
74+ private FrameLayout bannerSlot ;
7275
7376 @ SuppressLint ("SetJavaScriptEnabled" )
7477 @ Override
@@ -102,19 +105,31 @@ protected void onCreate(Bundle savedInstanceState) {
102105 progressBar .setLayoutParams (pbParams );
103106 progressBar .setVisibility (View .GONE );
104107
105- FrameLayout rootLayout = new FrameLayout (this );
108+ // Estructura vertical (AdMob — banners SIEMPRE abajo, nunca sobre el
109+ // contenido): mainFrame (webview + barra de progreso) arriba, banner abajo.
110+ LinearLayout rootLayout = new LinearLayout (this );
111+ rootLayout .setOrientation (LinearLayout .VERTICAL );
106112 rootLayout .setBackgroundColor (0xFF080810 );
107- rootLayout .addView (swipeRefreshLayout , new FrameLayout .LayoutParams (
113+
114+ FrameLayout mainFrame = new FrameLayout (this );
115+ mainFrame .addView (swipeRefreshLayout , new FrameLayout .LayoutParams (
108116 ViewGroup .LayoutParams .MATCH_PARENT , ViewGroup .LayoutParams .MATCH_PARENT ));
109- rootLayout .addView (progressBar );
117+ mainFrame .addView (progressBar );
118+ rootLayout .addView (mainFrame , new LinearLayout .LayoutParams (
119+ ViewGroup .LayoutParams .MATCH_PARENT , 0 , 1f ));
120+
121+ bannerSlot = new FrameLayout (this );
122+ bannerSlot .setVisibility (View .GONE );
123+ rootLayout .addView (bannerSlot , new LinearLayout .LayoutParams (
124+ ViewGroup .LayoutParams .MATCH_PARENT , ViewGroup .LayoutParams .WRAP_CONTENT ));
110125
111126 setContentView (rootLayout );
112127
113128 try { setupStatusBar (); } catch (Throwable t ) { crashLog ("statusBar" , t ); }
114129 try { createNotificationChannels (); } catch (Throwable t ) { crashLog ("notifChannels" , t ); }
115130 try { requestAllPermissions (); } catch (Throwable t ) { crashLog ("permissions" , t ); }
116131 try { setupWebView (); } catch (Throwable t ) { crashLog ("webView" , t ); }
117- try { initAdMob (rootLayout ); } catch (Throwable t ) { crashLog ("adMob" , t ); }
132+ try { initAdMob (); } catch (Throwable t ) { crashLog ("adMob" , t ); }
118133 try { registerFCMToken (); } catch (Throwable t ) { crashLog ("fcm" , t ); }
119134 try { checkInternetAndLoad (); } catch (Throwable t ) { crashLog ("internet" , t ); }
120135
@@ -133,11 +148,11 @@ protected void onCreate(Bundle savedInstanceState) {
133148 // Nada de AdMob se pide antes de que UMP resuelva el consentimiento
134149 // (EEE/UK/Canadá). Fuera de esas regiones lookup UMP resuelve inmediato
135150 // con canRequestAds=true y no se bloquea ningún anuncio.
136- private void initAdMob (final FrameLayout rootLayout ) {
151+ private void initAdMob () {
137152 ConsentManager .init (this , () -> {
138153 runOnUiThread (() -> {
139154 if (!ConsentManager .canRequestAds ()) return ;
140- BannerAdManager .setup (MainActivity .this , rootLayout );
155+ BannerAdManager .setup (MainActivity .this , bannerSlot );
141156 RewardedAdManager .load (MainActivity .this );
142157 InterstitialAdManager .load (MainActivity .this );
143158 });
0 commit comments