我想在多个活动中使用视图。就我而言,它是一个浮动动作按钮。当我通过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
标签转换为视图。
编辑:
如评论中所述,将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);
}