我想在多个活动中使用视图。就我而言,它是一个FloatingActionButton。我通过findViewById搜索视图时,程序抛出 NullPointerException 。如何访问FloatingActionButton?
由于按钮应始终相同,因此我创建了一个XML布局,仅在merge
根元素中包含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
标记
应该{{1}} FloatingActionButton
的XML Activitiy布局
include
到目前为止。
为了在我的所有活动中拥有相同的功能,我创建了一个BaseActivity,我的其他类继承了它,例如我的MainActivity。
BaseActivity
<include
android:id="@+id/include_merge"
layout="@layout/floating_button" />
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);
}
}
启动应用程序时,我在BaseActivity中收到 NullPointerException ,试图找到内部元素,因为View变量 include_merge 为空。
当我阅读here public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
标记时,根元素应该具有相同的include
。使用android:id
作为根元素时有区别吗?甚至可以将merge
标记转换为视图。
我是否需要在BaseActivity中使用setContentView,因为它的onCreate方法在MainActivity之前调用?
将merge
添加到BaseActivity,如评论中所述仍然无法修复它。
答案 0 :(得分:0)
您不必将id
设置为<include>
或<merge>
标记。只需将其删除findViewById(R.id.include_merge)
即可。 <merge>
标记表示其所有视图都已添加到<include>
标记的容器中。因此,没有View
的{id}已经设置了它。但是你可以直接找到FAB。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fab = include_merge.findViewById(R.id.addBloodDonation);
}