如何通过代码实现Banner广告与DrawView的共存显示?
你遇到的核心问题是重复调用setContentView():第一次加载了包含DrawView和AdView的XML布局,第二次却直接把整个ContentView替换成了单独的DrawView,这就导致原来布局里的AdView被完全覆盖,自然没法同时显示两者。下面是具体的修复方案:
第一步:调整XML布局结构
先优化你的布局,让DrawView占据屏幕剩余空间,Banner广告固定在底部。同时给DrawView添加id,方便后续在代码中获取实例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 自定义DrawView,通过weight占满除Banner外的所有空间 --> <com.kilnake.patta.picpuzz.TileActivity.DrawView android:id="@+id/drawView" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@color/colorPrimary"/> <!-- Banner广告,居中显示在底部 --> <com.google.android.gms.ads.AdView android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" ads:adSize="BANNER" ads:adUnitId="ca-app-pub-3940256099942544/6300978111" /> </LinearLayout>
第二步:修正Java代码逻辑
去掉重复的setContentView()调用,直接从XML布局中获取已初始化的DrawView和AdView实例,不再手动创建DrawView:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); size = getIntent().getIntExtra("SIZE", 3); // 只调用一次setContentView,加载完整的XML布局 setContentView(R.layout.activity_tile); // 从布局中获取DrawView实例,而非重新创建 drawView = findViewById(R.id.drawView); // 给DrawView设置size参数(需要在DrawView类中添加setSize方法) drawView.setSize(size); setTileSize(); // 初始化并加载广告 MobileAds.initialize(this, "ca-app-pub-3940256099942544/6300978111"); mAdView = findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder().build(); mAdView.loadAd(adRequest); }
第三步:完善DrawView类
因为XML初始化View会调用带AttributeSet的构造函数,且非静态内部类无法被XML直接引用,所以需要调整DrawView的实现:
// 改为public static内部类,让XML可以正确引用 public static class DrawView extends View { private int size; // 实现XML初始化需要的构造函数 public DrawView(Context context) { super(context); init(); } public DrawView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DrawView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { // 这里放你的初始化逻辑 } // 添加setSize方法,用于接收外部传入的size参数 public void setSize(int size) { this.size = size; invalidate(); // 刷新视图,应用新的size参数 } // 你的onDraw等绘制逻辑... }
这样修改后,DrawView会占据屏幕大部分空间,Banner广告固定在底部,两者就能同时正常显示了。
内容的提问来源于stack exchange,提问作者Ravi Kilnake
相关产品推荐
相关产品推荐

