findViewById 用于在包含的合并根元素内查看



我想在多个活动中使用视图。就我而言,它是一个浮动动作按钮。当我通过findViewById搜索视图时,程序会抛出一个NullPointerException。如何访问浮动操作按钮?


由于按钮应始终相同,因此我创建了一个XML布局,仅在merge根元素中包含浮动操作按钮,以减少使用ì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浮动操作按钮的 XML 活动布局

<include
android:id="@+id/include_merge"
layout="@layout/floating_button" />

到目前为止,这很有效。

为了在我所有的活动中拥有相同的功能,我创建了一个基本活动,我的其他类继承自它,例如我的主活动。

基本活动

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);
}
}

主活动(示例(

public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

启动应用程序时,我在 BaseActivity 中收到一个NullPointerException,用于尝试查找内部元素,因为 View变量include_merge为空。

当我在这里阅读时,include标签和根元素应该具有相同的android:id。使用merge作为根元素时有区别吗?甚至可以将merge标签转换为视图。

我是否需要在 BaseActivity 中使用 setContentView,因为它的 onCreate 方法在 MainActivity 之前被调用?

编辑:

如评论中所述,将setContentView(R.layout.activity_main);添加到基本活动,但仍未修复它。

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

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

最新更新