【问题标题】:calling invalidateOptionsMenu() causes SearchView to stop working调用 invalidateOptionsMenu() 会导致 SearchView 停止工作
【发布时间】:2015-07-17 05:50:44
【问题描述】:

我正在使用 DrawerLayout,并且无论何时打开或关闭它,我都会使用 invalidateOptionsMenu()。问题是在打开和关闭 DrawerLayout 后 SearchView 停止工作。

第一类:

private DrawerLayout DrawerLayout;
private ListView DrawerList;
private ActionBarDrawerToggle DrawerToggle;
private CharSequence DrawerTitle;
private CharSequence Title;
.....

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
        R.drawable.menu, R.string.app_name, R.string.hello) {
    public void onDrawerClosed(View view) {
        getActionBar().setTitle(Title);
        invalidateOptionsMenu(); 
        // onPrepareOptionsMenu()
    }

    public void onDrawerOpened(View drawerView) {
        getActionBar().setTitle(DrawerTitle);
        invalidateOptionsMenu(); 
        // onPrepareOptionsMenu()
    }
};

mDrawerLayout.setDrawerListener(DrawerToggle);

SearchView 定义 Class2:

@Override
public void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    getActivity().invalidateOptionsMenu();
    // onPrepareOptionsMenu()
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.actionbar, menu);
    searchView = (SearchView) menu.findItem(R.id.search).getActionView();
}

两个类都没有定义 onPrepareOptionsMenu()

具体来说,这是停止工作的原因:

@Override
public boolean onQueryTextChange(String newText) {
   adapter.getFilter().filter(newText);
    return false;
}

adapter 是 ListView 的适配器,getFilter 指向实现可过滤的 baseadapter 类。

【问题讨论】:

  • 请给我们一个堆栈跟踪
  • 没什么可看的......
  • 停止工作 -> 崩溃 -> 意外异常 -> 大量堆栈跟踪。我想知道错误发生在哪里。再加上onPrepareOptionsMenu,好像很重要。
  • 好的,应用程序没有崩溃,我从来没有真正定义过onprepareoptionsmenu。没有例外。
  • 我面临同样的问题,但我不知道如何使用@TaylorCourtney 解决方案。如果您能帮助我,我将不胜感激。 *.com/questions/54756799/…

标签: java android searchview drawerlayout


【解决方案1】:

好的,我通过删除 invalidateOptionsMenu() 并添加 super.onDrawerOpened 和 super.onDrawerClosed 来修复它。

【讨论】:

    【解决方案2】:

    它发生在我身上,解决方案是在 invalidateOptionsMenu() 之后初始化搜索菜单项,即使它已经被初始化了

        searchMenuItem = menu.findItem(R.id.search);
    

    比:

        searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
    

    【讨论】:

      最近更新 更多