如果选项卡位置发生更改或通过调用onPageChangeListener,请关闭searchview

时间:2013-12-25 09:36:16

标签: android actionbarsherlock searchview

我有一个活动,我从哪里加载6个片段。 三个片段中有六个具有搜索视图,其余三个片段没有实现搜索视图。

我已经制作了两个menu.xml

  • 一个具有搜索视图和commonitem用于操作栏和其他
  • 一个没有searchview并包含常用项目

现在,如果我在第一个选项卡中展开搜索视图,然后移动到第二个选项卡,则searchview仍然打开(我知道它是第二个选项卡的搜索视图,因为我已经为每个片段实现了onCreateOptionMenu()),我不想要。

我想要的是当我移动到第一个片段到第二个或第三个片段时,searchview应该折叠并且只点击搜索视图(在当前片段中它应该被扩展)。

此外,如果我将第一个片段移动到第2个,第3个和第4个(我的帐户信息片段,不包含操作栏中的searchview),那么在第4个片段中我仍然可以在开放模式下获得searchview ...

我想知道的另一件事是,通过点击搜索视图,它会被扩展并弹出软键盘,这是搜索视图的默认行为(扩展和打开键盘)吗?

我想在点击搜索视图的文本(编辑文本)区域时打开键盘。

希望明确...... 任何建议/链接将不胜感激......

如果我需要更多细节,请告诉我.......

编辑::

应用S.D.的解决方案

在2.3.6上进行测试

1)当我在第一个片段(第一个标签)时

enter image description here

2)在相同的片段::

中扩展它之后

enter image description here

3)移动到下一个片段(Tab,通过保持searchview打开)::

enter image description here

测试4.2.1 ::

1)当我在第一个片段(第一个标签)时

enter image description here

2)在相同的片段::

中扩展它之后

enter image description here

3)移动到下一个片段(Tab,通过保持searchview打开)::

enter image description here

我在我的容器活动中设置了'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());
}

6 个答案:

答案 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);
    }

祝你有美好的一天!