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

时间:2015-05-06 21:24:19

标签: java android searchview drawerlayout

我正在使用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转到实现可过滤的baseadapter类。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我遇到的解决办法是在invalidateOptionsMenu()之后初始化搜索菜单项,即使它已经被引入

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

而不是:

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