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

时间:2016-12-01 01:20:46

标签: android android-fragments android-viewpager searchview

我有两个ViewPager的{​​{1}}。

Fragments中的first fragment加载SearchView

Toolbar我想隐藏 second fragment并在菜单上显示另一项。

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

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

片段编号1:

onCreateOptionsMenu

menu.xml文件

@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 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>

那解决方案有这个问题吗?感谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我已修复错误更新 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()