API 15中的menuItem.getActionView()== null

时间:2014-10-06 15:31:34

标签: android

我在我的应用中支持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及更高版本的设备。有没有人遇到过这个问题?

2 个答案:

答案 0 :(得分:1)

如果出现问题,给布局充气通常会导致立即崩溃,但菜单资源不会膨胀。如果存在某些问题,则会记录堆栈跟踪,但是否则会处理异常,因此继续执行。只是过了一段时间,我们才意识到,当事情发生后,某些事情无效。

自定义操作栏项(actionLayoutactionViewClassactionProvider)特别容易出现这种情况。如果加载其中任何一个有问题 - 比如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);
    }
}