findViewById用于包含合并根元素内的视图

时间:2018-05-05 14:30:31

标签: java android merge include findviewbyid

我想在多个活动中使用视图。就我而言,它是一个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,如评论中所述仍然无法修复它。

1 个答案:

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