我一直在尝试实现自定义操作栏,但是由于下面的代码,我一直收到空指针异常。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setCustomView(R.layout.home_action_bar);
}
显然,getSupportActionBar
返回null。在尝试使其运行了几个小时而没有运气之后,我开始思考为什么我真的需要将其设置为自定义操作栏。我能够创建想要的设计,如下图所示,它看起来很好,没有上面的代码,或者没有尝试创建自定义操作栏,白色区域是scrollView,内容将位于动作栏。因此,我的问题是,有必要使自定义操作栏起作用,并且为什么上述代码不起作用?
答案 0 :(得分:1)
为什么
getSupportActionBar
返回null?
您可能正在使用NoActionBar
之类的Theme.AppCompat.Light.NoActionBar
主题,
删除NoActionBar
部分。
像Theme.AppCompat.Light
或Theme.AppCompat.Light.DarkActionBar
为什么使用ActionBar而不是布局?
原因1
创建自定义布局将添加许多样板代码。 Actionbar
通常在您应用的所有活动中保持一致。因此,如果使用布局,则最终将向所有活动布局添加相同的布局代码。 (即使您使用<layout/>
标签添加了布局,也仍然是不必要的代码。)
原因2
您的action items
中将有ActionBar
。使用自定义布局,您最终将在每个活动中在这些findViewById
上调用action items
。 findViewById
是一项昂贵的操作。因此,它肯定会影响您应用的性能(虽然可以忽略不计,但仍然可以)。另外,这是您在每个活动中都需要编写的不必要的代码。