SearchView 在 ViewPager 的第二个片段中为空

SearchView is null in second fragment in ViewPager

我有一个 ViewPager 和两个 Fragments

first fragment中加载SearchViewToolbar中。

second fragment 中,我想 隐藏 SearchView 并在菜单上显示另一个项目。

问题是,当我尝试从 onCreateOptionsMenu 中的 second fragment 视图中隐藏 SearchView 项目时,总是 null

在将 sdk 和 android.support 库更新到最新版本之前,从版本 22 开始,这些方法可以正常工作。

片段编号 1:

@Override
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater = getActivity().getMenuInflater();
    inflater.inflate(R.menu.menu_view_pager, menu);

    final MenuItem item = (menu.findItem(R.id.action_search));
    SearchView searchView = (SearchView) item.getActionView();
    MenuItemCompat.setActionView(item, searchView);
    MenuItemCompat.expandActionView(item);
    searchView.setMaxWidth(Integer.MAX_VALUE);
    searchView.setIconifiedByDefault(true);
    searchView.setIconified(false);
    ............. 
    .............
  }

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <item
        android:id="@+id/action_search"
        android:title="@string/search_action"
        android:icon="@android:drawable/ic_menu_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always"
        android:orderInCategory="100"
        android:gravity="start"
        />
   </menu>

片段二

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {


    inflater.inflate(R.menu.menu_edit, menu);
    menu.findItem(R.id.action_search).setVisible(false); 

    /*The top line cause NullPointerException. In debug "action_search" 
     item is in ActionItems, but menu items is empty.*/

    menuItem = menu.findItem(R.id.action_edit);
    disableButtons();
    super.onCreateOptionsMenu(menu, inflater);
}

这个问题有解决办法吗?谢谢

你有没有在你的onCreateView方法中加入这行代码:setHasOptionsMenu(true); 在您的两个片段中添加此行。 如果您仍然无法解决此问题,请为您的第二个片段创建一个新的菜单资源 class。但是我自己用了一个菜单资源 10 个片段 class 所以你也应该可以。

我修复了更新 BuildTools (v.25.0.2)AndroidSupportRepository (v.41) 的错误 我也在 onPrepareOptionsMenu:

中使用了这个逻辑
  @Override
  public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    toolbar.getMenu().clear();    //remove all items
    toolbar.inflateMenu(R.menu.menu_edit);
    menuItem = toolbar.getMenu().findItem(R.id.action_edit);
 }

升级前,此方法无法扩充菜单。只有 运行 menu.clear()