SearchView 在 ViewPager 的第二个片段中为空
SearchView is null in second fragment in ViewPager
我有一个 ViewPager
和两个 Fragments
。
在first fragment
中加载SearchView
在Toolbar
中。
在 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()
我有一个 ViewPager
和两个 Fragments
。
在first fragment
中加载SearchView
在Toolbar
中。
在 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()