带有片段的 ViewPager - SearchView 没有响应
ViewPager with Fragments - SearchView doesn't respond
解决方案:
问题是由于使用了 app:showAsAction="collapseActionView|always"
。将其替换为 app:showAsAction="always"
解决了问题。
我有一个带有 ViewPager 的片段,而 ViewPager 有 3 个片段。每个 Fragment 在其菜单项中都有一个 SearchView(在工具栏中显示为菜单项)。当我点击 SearchView 时,我在 onOptionsItemSelected 中获得了点击事件,但 SearchView 没有展开。不知道该怎么做。
我在 onCreate()
中为所有片段设置了 setHasOptionMenu(true)
。
这是我当前的代码:对于每个片段
onCreateOptionsMenu:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_new, menu);
SearchManager searchManager = (SearchManager) activity.
getSystemService(Context.SEARCH_SERVICE);
searchMenuItem = menu.findItem(R.id.ic_action_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.
getSearchableInfo(activity.getComponentName()));
searchView.setOnQueryTextListener(this);
}
菜单XML文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/ic_action_search"
android:icon="@drawable/ic_search_white_24dp"
android:orderInCategory="0"
android:title="Search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="collapseActionView|always" />
<item
android:id="@+id/action_list"
android:icon="@drawable/ic_action_list_white"
android:orderInCategory="1"
android:title="@string/action_list"
android:checked="true"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/action_grid"
android:icon="@drawable/ic_action_grid_white"
android:orderInCategory="2"
android:title="@string/action_grid"
android:checked="false"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/action_mini"
android:icon="@drawable/ic_action_grid_white"
android:orderInCategory="3"
android:title="@string/action_mini"
android:checked="false"
android:checkable="true"
app:showAsAction="never" />
</menu>
其他相关代码:如有帮助
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mViewPagerPetitionsRecyclerViewAdapter.getFilter().filter(newText);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_list) {
prefs.edit().putString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.LIST_VIEW).apply();
mStaggeredLayoutManager.setSpanCount(1);
} else if (item.getItemId() == R.id.action_grid) {
prefs.edit().putString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.GRID_VIEW).apply();
mStaggeredLayoutManager.setSpanCount(2);
} else if (item.getItemId() == R.id.action_mini) {
prefs.edit().putString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.MINI_VIEW).apply();
mStaggeredLayoutManager.setSpanCount(1);
}
ActivityCompat.invalidateOptionsMenu(activity);
mViewPagerPetitionsRecyclerViewAdapter.notifyDataSetChanged();
mIMainNewPetitionsListener.onLayoutChangedListener();
return super.onOptionsItemSelected(item);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem list_item = menu.findItem(R.id.action_list);
MenuItem grid_item = menu.findItem(R.id.action_grid);
MenuItem mini_item = menu.findItem(R.id.action_mini);
String item_type = prefs.getString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.LIST_VIEW);
if (item_type.equalsIgnoreCase(Const.VIEWPAGER.LIST_VIEW)) {
list_item.setChecked(true);
grid_item.setChecked(false);
mini_item.setChecked(false);
} else if (item_type.equalsIgnoreCase(Const.VIEWPAGER.GRID_VIEW)) {
list_item.setChecked(false);
grid_item.setChecked(true);
mini_item.setChecked(false);
} else if (item_type.equalsIgnoreCase(Const.VIEWPAGER.MINI_VIEW)) {
list_item.setChecked(false);
grid_item.setChecked(false);
mini_item.setChecked(true);
}
super.onPrepareOptionsMenu(menu);
}
我认为你必须自己扩展动作视图:
在onOptionsItemSelected
中:
if (item.getItemId() == R.id.action_search) {
item.expandActionVew();
}
我正在使用 Appcompat v7 23.1.1。我有一个片段,其中 ViewPager(FragmentStatePagerAdapter) 加载了 3 个片段。我在这 3 个片段中都有一个 SearchView。当我单击 SearchView 时,视图没有展开。
问题是由于使用了 app:showAsAction="collapseActionView|always"
。用 app:showAsAction="always"
替换它解决了这个问题。
不确定这是否是一个错误,但是 this post and this post 帮助我解决了这个问题。
解决方案:
问题是由于使用了 app:showAsAction="collapseActionView|always"
。将其替换为 app:showAsAction="always"
解决了问题。
我有一个带有 ViewPager 的片段,而 ViewPager 有 3 个片段。每个 Fragment 在其菜单项中都有一个 SearchView(在工具栏中显示为菜单项)。当我点击 SearchView 时,我在 onOptionsItemSelected 中获得了点击事件,但 SearchView 没有展开。不知道该怎么做。
我在 onCreate()
中为所有片段设置了 setHasOptionMenu(true)
。
这是我当前的代码:对于每个片段
onCreateOptionsMenu:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_new, menu);
SearchManager searchManager = (SearchManager) activity.
getSystemService(Context.SEARCH_SERVICE);
searchMenuItem = menu.findItem(R.id.ic_action_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.
getSearchableInfo(activity.getComponentName()));
searchView.setOnQueryTextListener(this);
}
菜单XML文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/ic_action_search"
android:icon="@drawable/ic_search_white_24dp"
android:orderInCategory="0"
android:title="Search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="collapseActionView|always" />
<item
android:id="@+id/action_list"
android:icon="@drawable/ic_action_list_white"
android:orderInCategory="1"
android:title="@string/action_list"
android:checked="true"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/action_grid"
android:icon="@drawable/ic_action_grid_white"
android:orderInCategory="2"
android:title="@string/action_grid"
android:checked="false"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/action_mini"
android:icon="@drawable/ic_action_grid_white"
android:orderInCategory="3"
android:title="@string/action_mini"
android:checked="false"
android:checkable="true"
app:showAsAction="never" />
</menu>
其他相关代码:如有帮助
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mViewPagerPetitionsRecyclerViewAdapter.getFilter().filter(newText);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_list) {
prefs.edit().putString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.LIST_VIEW).apply();
mStaggeredLayoutManager.setSpanCount(1);
} else if (item.getItemId() == R.id.action_grid) {
prefs.edit().putString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.GRID_VIEW).apply();
mStaggeredLayoutManager.setSpanCount(2);
} else if (item.getItemId() == R.id.action_mini) {
prefs.edit().putString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.MINI_VIEW).apply();
mStaggeredLayoutManager.setSpanCount(1);
}
ActivityCompat.invalidateOptionsMenu(activity);
mViewPagerPetitionsRecyclerViewAdapter.notifyDataSetChanged();
mIMainNewPetitionsListener.onLayoutChangedListener();
return super.onOptionsItemSelected(item);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem list_item = menu.findItem(R.id.action_list);
MenuItem grid_item = menu.findItem(R.id.action_grid);
MenuItem mini_item = menu.findItem(R.id.action_mini);
String item_type = prefs.getString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.LIST_VIEW);
if (item_type.equalsIgnoreCase(Const.VIEWPAGER.LIST_VIEW)) {
list_item.setChecked(true);
grid_item.setChecked(false);
mini_item.setChecked(false);
} else if (item_type.equalsIgnoreCase(Const.VIEWPAGER.GRID_VIEW)) {
list_item.setChecked(false);
grid_item.setChecked(true);
mini_item.setChecked(false);
} else if (item_type.equalsIgnoreCase(Const.VIEWPAGER.MINI_VIEW)) {
list_item.setChecked(false);
grid_item.setChecked(false);
mini_item.setChecked(true);
}
super.onPrepareOptionsMenu(menu);
}
我认为你必须自己扩展动作视图:
在onOptionsItemSelected
中:
if (item.getItemId() == R.id.action_search) {
item.expandActionVew();
}
我正在使用 Appcompat v7 23.1.1。我有一个片段,其中 ViewPager(FragmentStatePagerAdapter) 加载了 3 个片段。我在这 3 个片段中都有一个 SearchView。当我单击 SearchView 时,视图没有展开。
问题是由于使用了 app:showAsAction="collapseActionView|always"
。用 app:showAsAction="always"
替换它解决了这个问题。
不确定这是否是一个错误,但是 this post and this post 帮助我解决了这个问题。