【问题标题】:findViewById for view inside an included merge root-elementfindViewById 用于包含的合并根元素内的视图
【发布时间】: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 标记

应该include FloatingActionButton 的 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's onCreate() 会先被调用。
  • 在调用super.onCreate(savedInstanceState) 后在BaseActivity 中添加setContentView(R.layout.activity_main) 并不能解决此问题。我试过了,因为我之前已经假设过类似的事情。无论如何,我可以更新我的问题,以便它包含这个调用。
  • 在调用setContentView之前仍在尝试查找视图

标签: java android merge include findviewbyid


【解决方案1】:

您不必将id 设置为&lt;include&gt;&lt;merge&gt; 标记。只需删除它以及findViewById(R.id.include_merge)&lt;merge&gt; 标签表示其所有视图都添加到&lt;include&gt; 标签的容器中。因此没有View 具有您设置的id。但是你可以直接找到FAB。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    fab = include_merge.findViewById(R.id.addBloodDonation);
}

【讨论】:

  • 酷!感谢您的帮助:)
最近更新 更多