You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码实现Banner广告与DrawView的共存显示?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:48:40