Android多次调用setContentView仅显示最后一个视图的问题求助
解决Android中同时显示自定义绘图视图与XML布局控件的问题
嗨,我懂你折腾了好久都没搞定这个问题——Android里的setContentView()确实是个“霸道”的方法,每次调用都会完全替换当前Activity的根视图,所以你最后调用的setContentView(mCustomDrawableView)会把之前加载的XML布局(包含按钮的那个)给覆盖掉,这就是按钮消失的核心原因。
下面给你两种简单可行的解决方案,帮你同时显示自定义绘图视图和XML里的控件:
方法一:直接把自定义视图写入XML布局
这是最直观的方式,把你的自定义绘图视图当成普通控件一样,直接添加到activity_main.xml里,这样只需要一次setContentView()就能加载所有内容:
- 打开你的
activity_main.xml,在合适的位置添加自定义视图的标签(注意替换成你自己的包名和类名):
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- XML里原来的按钮等控件 --> <Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试按钮"/> <!-- 添加你的自定义绘图视图 --> <com.your.package.name.YourCustomDrawableView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout>
- 然后在Activity里只需要调用一次
setContentView():
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 这里可以正常初始化按钮等控件 Button myButton = findViewById(R.id.my_button); myButton.setOnClickListener(...); }
这样XML里的按钮和自定义绘图视图就会按照你设置的布局规则一起显示出来啦。
方法二:动态将自定义视图添加到XML布局的容器中
如果你不想修改XML,也可以先加载XML布局,再把自定义视图添加到布局里的某个容器(比如FrameLayout、LinearLayout)中:
- 先确保你的
activity_main.xml里有一个可以容纳自定义视图的容器,比如:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试按钮"/> <!-- 用来放自定义视图的容器 --> <FrameLayout android:id="@+id/draw_container" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout>
- 在Activity中先加载XML布局,再动态添加自定义视图:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化按钮 Button myButton = findViewById(R.id.my_button); // 创建自定义绘图视图实例 YourCustomDrawableView mCustomDrawableView = new YourCustomDrawableView(this); // 找到容器并添加自定义视图 FrameLayout container = findViewById(R.id.draw_container); // 设置自定义视图的布局参数,根据需求调整 FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ); container.addView(mCustomDrawableView, params); }
这样自定义视图就会被加入到容器中,和XML里的按钮等控件共存了。
总结一下:setContentView()的本质是设置Activity的根视图,每次调用都会替换掉之前的根视图,所以不能靠多次调用它来叠加视图。通过以上两种方法,你就能轻松实现自定义绘图视图和XML控件的同时显示啦。
内容的提问来源于stack exchange,提问作者CodingM
相关产品推荐
相关产品推荐

