调用invalidateOptionsMenu()会导致SearchView停止工作。

4

我正在使用 DrawerLayout,每当它打开或关闭时,我都会使用 invalidateOptionsMenu()。问题是,在打开和关闭 DrawerLayout 后,SearchView 就停止工作了。

Class1:

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方法在一个实现了Filterable接口的BaseAdapter类中。


请给我们提供一个堆栈跟踪。 - Eugen Pechanec
没有什么可以看的... - Taylor Courtney
停止工作 -> 崩溃 -> 意外异常 -> 一大堆的堆栈跟踪。我想找出错误发生的地方。此外,发布 onPrepareOptionsMenu,似乎很重要。 - Eugen Pechanec
好的,应用程序没有崩溃,而且我实际上从未定义onprepareoptionsmenu。没有异常情况。 - Taylor Courtney
我也遇到了同样的问题,但我不知道如何使用@TaylorCourtney的解决方案。如果您能帮助我,我将不胜感激。https://stackoverflow.com/questions/54756799/android-studio-invalidateoptionsmenu-causes-the-always-visible-items-to-stop - Aliton Oliveira
我认为我们的情况可能有些不同。我会小心覆盖onprepareoptions函数。 - Taylor Courtney
2个回答

0

这种情况也发生在我身上,解决方法是在invalidateOptionsMenu()之后初始化搜索菜单项,即使它已经被初始化过了。

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

然后:

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接