【发布时间】:2025-12-03 12:50:01
【问题描述】:
我想在多个活动中使用一个视图。在我的例子中,它是一个 FloatingActionButton。当我通过 findViewById 搜索视图时,程序会抛出 NullPointerException。如何访问 FloatingActionButton?
由于按钮应该始终相同,我创建了一个 XML 布局,仅包括 mergeroot 元素内的 FloatingActionButton,以减少使用 ìnclude 时的开销。
floating_button.xml
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/include_merge" >
<android.support.design.widget.FloatingActionButton
android:id="@+id/addBloodDonation"/>
</merge>
要在我的其他 XML 布局中使用它,我使用 include 标记
应该
includeFloatingActionButton 的 XML Activity 布局
<include
android:id="@+id/include_merge"
layout="@layout/floating_button" />
到目前为止有效。
为了在我的所有活动中拥有相同的功能,我创建了一个 BaseActivity,我的其他类从它继承,例如我的 MainActivity。
基础活动
public abstract class BaseActivity extends AppCompatActivity {
public FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View include_merge = findViewById(R.id.include_merge);
fab = include_merge.findViewById(R.id.addBloodDonation);
}
}
MainActivity(示例)
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
在启动应用程序时,我在 BaseActivity 中收到一个 NullPointerException,因为 View 变量 include_merge 为 null。
当我阅读here 时,include 标记和根元素应该具有相同的android:id。使用 merge 作为根元素时有区别吗?甚至可以将merge 标记转换为视图。
是否需要在 BaseActivity 中使用 setContentView,因为它的 onCreate 方法在 MainActivity 之前调用?
编辑:
已将 setContentView(R.layout.activity_main); 添加到 cmets 中提到的 BaseActivity,但仍然无法修复它。
【问题讨论】:
-
setContentView(R.layout.activity_main)还没有被调用。而你的BaseActivity'sonCreate()会先被调用。 -
在调用
super.onCreate(savedInstanceState)后在BaseActivity 中添加setContentView(R.layout.activity_main)并不能解决此问题。我试过了,因为我之前已经假设过类似的事情。无论如何,我可以更新我的问题,以便它包含这个调用。 -
在调用
setContentView之前仍在尝试查找视图
标签: java android merge include findviewbyid