Can getSupportActionBar be null right after setSupportActionBar?
即使我已经使用getSupportActionBar()设置了支持操作栏,我还是应该对getSupportActionBar()方法进行空检查吗?
在onCreate()中,我有三行
1 2 3
| Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(getIntent().getStringExtra(TITLE_KEY)); |
然后,Android Studio会给我警告
1
| "Method invocation may produce java.lang.NullPointerException" |
假设findViewById方法确实返回了有效的ToolBar对象,我是否仍需要对getSupportActionBar()方法进行空检查,还是忽略警告是否安全?
- 警告不是错误。您所谈论的警告是"可能产生",而不是"必须产生"。
-
@DhawalSodhaParmar,如果它是"它必须产生"那将是什么呢???总是返回null的getter方法是没有用的
这可能会产生NullPointer异常。
您已经创建了一个新的工具栏对象,可以使用toolbar.setTitle(getIntent().getStringExtra(TITLE_KEY));设置标题。您需要先执行此操作,然后再调用setSupportActionBar(toolbar);
由于已设置的操作栏是工具栏,因此无需调用getSupportActionBar()。因此,您可以直接使用该对象来编辑工具栏。那快于getSupportActionBar();
- 问题是有些事情无法通过ToolBar完成,例如setDisplayHomeAsUpEnabled
-
@Mood是的,但是对于发问者想要做的事情,工具栏很好
-
抱歉,@ tim687我很快解决了这个问题。
-
我看着这个。事实证明,在setSupportActionBar()之后执行toolbar.setTitle()无效。我发现了这个帖子stackoverflow.com/questions/26486730/…也谈到了这一点。但是,与他的示例不同的是,如果我在调用setSupportActionBar()之前先完成了toolbar.setTitle()的工作,那我就为我工作
-
@MungoRae谢谢!我已经更新了答案。如果这解决了您的问题,请接受
-
谢谢您的回答。它确实使用setTitle()帮助解决了这种特定情况,但正如Mood所指出的那样,我在总体上询问的是与getSupportActioBar方法打交道的更多问题,而且我觉得NileshJarad的回答更多是我想要的。您的答案非常有用。
我的建议是:-不要检查null,因为警告不是错误
您正在谈论的警告说"可能会产生"。它没有说"必将产生"。
但是如果要再次确认,可以检查是否为空
否,您不应该对此进行检查。因为如果假设失败(例如,如果findViewById(R.id.toolbar)由于在项目的另一个文件中引入了错误而开始返回null),则您确实希望引发NullPointerException,因此在测试时很容易找到错误。铅>
换句话说:我认为,最好的方法是快速失败。
我的代码如下所示,并带有使警告消失的注释:
1 2 3
| //noinspection ConstantConditions: Action bar should always be present. If not, we prefer a NullPointerException here.
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true); |
为避免出现此警告,您始终可以检查ActionBar对象是否为空。
1 2 3 4 5
| ActionBar mActionBar = getSupportActionBar();
if (mActionBar != null) {
mActionBar.setTitle(getIntent().getStringExtra(TITLE_KEY));
} |