【问题标题】:Close the searchview if tab position get changed or by calling onPageChangeListener如果选项卡位置发生更改或通过调用 onPageChangeListener 关闭搜索视图
【发布时间】:2014-01-13 07:26:22
【问题描述】:

我有一项活动,我正在加载 6 个片段。 三个片段中有六个有搜索视图,其余三个没有实现搜索视图。

我在其中做了两个menu.xml

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

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

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

此外,如果我将第一个片段移至第 2、3 和 4 个(我的帐户信息片段,操作栏中不包含搜索视图),那么在第 4 个片段中,我仍然会在打开模式下获得搜索视图...

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

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

希望我清楚.... 任何建议/链接将不胜感激...

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

编辑::

应用 S.D. 的解决方案

在 2.3.6 上测试

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

2)在同一片段中展开后::

3)移动到下一个片段(选项卡,通过保持搜索视图打开)::

在 4.2.1 上测试 ::

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

2)在同一片段中展开后::

3)移动到下一个片段(选项卡,通过保持搜索视图打开)::

我在下面的方法中在我的容器活动中设置了“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());
}

【问题讨论】:

    标签: android actionbarsherlock searchview


    【解决方案1】:

    要关闭您的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 将自动弹出,搜索文本字段将被聚焦,从而自动打开键盘。但是,您应该能够移除将关闭键盘的 textview 的焦点。 check here

    【讨论】:

    • @longillong 我已经在onPause()onDestroyView() 中设置了您的解决方案。但是发现了相同的结果......知道为什么会发生这种行为吗?
    【解决方案2】:

    搜索视图实现有点奇怪,我不确定它是错误还是预期功能。要正确折叠 SearchView,您必须调用 setIconified(true) 两次。第一次调用有时会清除文本,第二次调用会实际折叠它。

    【讨论】:

    • 我应该在哪里称呼它?在onPause() 或其他地方?
    • @AndroidLearner 我认为您应该在更改标签片段的地方调用它。
    • 请检查我的编辑,我已经尝试过你的建议,这给了我一些奇怪的输出。知道为什么会发生这种行为吗?
    • @AndroidLearner ViewPager 一次可能会保留多个片段,这可能会导致 2 个搜索视图添加到操作菜单。为所有片段保留单独的搜索视图不是一个好主意。您可以在父活动的菜单中保留一个搜索视图,授予其对附加片段的引用。
    【解决方案3】:

    当 SearchView 在 ActionBar 中用作可折叠菜单项的操作视图时,需要使用 setIconifiedByDefault(true) 将其默认设置为图标化。这是默认设置,因此无需执行任何操作。

    设置搜索字段的默认或静止状态。如果为 true,则默认显示单个搜索图标,并在按下时展开以显示文本字段和其他按钮。此外,如果默认状态是图标化的,则在按下关闭按钮时它会折叠到该状态。对此属性的更改将立即生效。

    来源

    http://developer.android.com/reference/android/widget/SearchView.html#setIconifiedByDefault(boolean)

    【讨论】:

      【解决方案4】:
      MenuItem menuSearch = menu.findItem(R.id.itemSearch);
      SearchView searchView = (SearchView) menuSearch.getActionView();
      menuSearch.collapseActionView();
      

      你试过上面的collapseActionView()方法吗?您需要在更改选项卡的地方调用此方法。如果您仍有问题,请告诉我。

      【讨论】:

      • 感谢您的回复。我之前也尝试过这种方式,并在我的编辑中找到了我在上面粘贴的结果(请参考 2.3.6 上的图像 3 测试,左侧的搜索图标)以及显示的软键盘......
      • @AndroidLearner 你试过使用 searchView.onActionViewCollapsed() 吗?
      【解决方案5】:
      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) {
      
                  }
              });
          }
      

      【讨论】:

        【解决方案6】:

        你必须单独调用菜单..

        这是一个菜单代码

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

        将代码改为Fragment 1和Fragment 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);
            }
        

        祝你有美好的一天!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-23
          • 1970-01-01
          • 1970-01-01
          • 2015-12-11
          相关资源
          最近更新 更多