我在我的应用中支持API 15,当我尝试从菜单中获取searchView
时,我遇到了这些用户的崩溃。
以下是我的代码:
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem menuItem = menu.getItem(0);
searchView = (SearchView)menuItem.getActionView();
searchView.setIconifiedByDefault(false);
searchView.setQuery("", true);
menuItem.expandActionView();
}
我在这一行得到 NullPointerException :
searchView.setIconifiedByDefault(false);
因为searchView
为空。这适用于API 16及更高版本的设备。有没有人遇到过这个问题?
答案 0 :(得分:1)
如果出现问题,给布局充气通常会导致立即崩溃,但菜单资源不会膨胀。如果存在某些问题,则会记录堆栈跟踪,但是否则会处理异常,因此继续执行。只是过了一段时间,我们才意识到,当事情发生后,某些事情无效。
自定义操作栏项(actionLayout
,actionViewClass
,actionProvider
)特别容易出现这种情况。如果加载其中任何一个有问题 - 比如actionViewClass
没有实现正确的构造函数 - 我们只在我们尝试检索自定义项并获得null
时才发现它。解决方案是通过LogCat搜索并查找与处理的异常相关联的堆栈跟踪,以查看实际出现的问题。
在与API级别相关的情况下,与此类似,最可能的情况是自定义操作项的初始化是指旧版Android上不存在的方法,因此失败。
答案 1 :(得分:0)
我也遇到了和你一样的问题,并且遇到了这个stackoverflow问题。经过一番努力,我找到了这个问题的核心和解决方案。
在API15 中,在应用初始化期间,仅调用onCreateOptionsMenu
,但onPrepareOptionsMenu
不是。
在API16及更高版本中,onPrepareOptionsMenu
之后立即调用onCreateOptionsMenu
。
所以我的解决方案是在onPrepareOptionsMenu
:
onCreateOptionsMenu
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
(...)
if (Build.VERSION.SDK_INT < 16) {
onPrepareOptionsMenu(menu);
}
}