我有一个活动,我从哪里加载6个片段。 三个片段中有六个具有搜索视图,其余三个片段没有实现搜索视图。
我已经制作了两个menu.xml
现在,如果我在第一个选项卡中展开搜索视图,然后移动到第二个选项卡,则searchview仍然打开(我知道它是第二个选项卡的搜索视图,因为我已经为每个片段实现了onCreateOptionMenu()),我不想要。
我想要的是当我移动到第一个片段到第二个或第三个片段时,searchview应该折叠并且只点击搜索视图(在当前片段中它应该被扩展)。
此外,如果我将第一个片段移动到第2个,第3个和第4个(我的帐户信息片段,不包含操作栏中的searchview),那么在第4个片段中我仍然可以在开放模式下获得searchview ...
我想知道的另一件事是,通过点击搜索视图,它会被扩展并弹出软键盘,这是搜索视图的默认行为(扩展和打开键盘)吗?
我想在点击搜索视图的文本(编辑文本)区域时打开键盘。
希望明确...... 任何建议/链接将不胜感激......如果我需要更多细节,请告诉我.......
编辑::
应用S.D.的解决方案
在2.3.6上进行测试
1)当我在第一个片段(第一个标签)时
2)在相同的片段::
中扩展它之后
3)移动到下一个片段(Tab,通过保持searchview打开)::
测试4.2.1 ::
1)当我在第一个片段(第一个标签)时
2)在相同的片段::
中扩展它之后
3)移动到下一个片段(Tab,通过保持searchview打开)::
我在我的容器活动中设置了'setIconified(true)'(我的所有片段都被编码)在下面的方法::
@Override
public void onPageSelected(int position)
{
if (searchView!=null && !searchView.isIconified()) { //true == searchView closed
searchView.setIconified(true);
searchView.setIconified(true);
}
actionBar.setSelectedNavigationItem(position);
}
@Override
public void onTabSelected(Tab tabposition, FragmentTransaction fragmentposition) {
if (searchView!=null && !searchView.isIconified()) { //true == searchView closed
searchView.setIconified(true);
//searchView.setIconified(true);
}
awesomePager.setCurrentItem(tabposition.getPosition());
}
答案 0 :(得分:5)
搜索视图实现有点奇怪我不确定它是一个bug还是预期的功能。要正确折叠SearchView,您必须两次调用setIconified(true)
。第一次调用有时会清除文本,第二次会实际崩溃。
答案 1 :(得分:4)
要关闭SearchView
,您可以使用searchview.setIconified(true)
。因此,在您的片段onPause
中,您可以致电:
public void onPause() { //not sure if you should use onDestroyView() instead
super.onPause();
if (!yourSearchView.isIconified()) { //true == searchView closed
yourSearchView.setIconified(true);
}
}
SearchView
的自定义行为是显示键盘。如果单击“搜索”图标,SearchView
将自动弹出,搜索TextField将自动聚焦,从而自动打开键盘。但是,您应该能够删除将关闭键盘的textview的焦点。 check here
答案 2 :(得分:3)
MenuItem menuSearch = menu.findItem(R.id.itemSearch);
SearchView searchView = (SearchView) menuSearch.getActionView();
menuSearch.collapseActionView();
您是否尝试过collapseActionView()
方法?您需要在更改选项卡的位置调用此方法。如果你还有问题,请告诉我。
答案 3 :(得分:1)
当在ActionBar中将SearchView用作可折叠菜单项的操作视图时,需要使用setIconifiedByDefault(true)将其设置为默认图标化。这是默认设置,因此无需执行任何操作。
设置搜索字段的默认或静止状态。如果为true,则默认显示单个搜索图标,并在按下时展开以显示文本字段和其他按钮。此外,如果默认状态是图标化的,则在按下关闭按钮时它会折叠到该状态。对此属性的更改将立即生效。
来源
http://developer.android.com/reference/android/widget/SearchView.html#setIconifiedByDefault(boolean)
答案 4 :(得分:1)
private void setTabListener() {
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
invalidateOptionsMenu();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
答案 5 :(得分:0)
您必须分别调用菜单。
这是菜单代码
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".HomeActivity"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_search_black_24dp"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView"
android:title="Search"/>
</menu>
将代码更改为片段1和片段2
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.action_search, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchManager searchManager =
(SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
androidx.appcompat.widget.SearchView searchView =
(androidx.appcompat.widget.SearchView) menu.findItem(R.id.action_search).getActionView();
if (searchItem != null) {
searchView = (SearchView) searchItem.getActionView();
}
if (searchView != null) {
searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//your search code
return true;
}
});
}
super.onCreateOptionsMenu(menu, inflater);
}
祝你有美好的一天!