【问题标题】:SearchView.OnCloseListener does not get invokedSearchView.OnCloseListener 没有被调用
【发布时间】:2012-12-04 22:48:24
【问题描述】:

我正在使用操作栏并向其添加 searchView。我已经实现了 searchView.onCLoseListener 但这似乎没有被调用。有什么建议吗?

我的代码看起来像这样:

SearchView searchView = new SearchView(getContext());
searchView.setOnCloseListener(new OnCloseListener() {

  public boolean onClose() {
    searchView.setVisibility(SearchView.GONE);
    // Do Something

    return true;
  }
});

【问题讨论】:

    标签: java android android-widget searchview


    【解决方案1】:

    我在 android 4.1.1 上遇到了同样的问题。看起来这是一个已知的错误:https://code.google.com/p/android/issues/detail?id=25758

    无论如何,作为一种解决方法,我使用了状态更改侦听器(当 SearchView 与操作栏分离时,它也明显关闭)。

    view.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
    
        @Override
        public void onViewDetachedFromWindow(View arg0) {
            // search was detached/closed
        }
    
        @Override
        public void onViewAttachedToWindow(View arg0) {
            // search was opened
        }
    });
    

    以上代码在我的情况下运行良好。

    【讨论】:

    • 不错的方法。工作
    • 有了这个答案,你说“你现在安全了,我亲爱的孩子”,我在这里告诉你:“我欠你一条命”。合法,这个答案很好用。没有控制 SearchView 状态的合理选项,经过一天的搜索,我找到了这个并尝试了它——它只是。作品。在此发布四年后,它仍然非常相关。绝对应该是公认的答案!
    • 我想补充一点,它只对我有用,当我写的时候......(new View.OnAttachStateChangeListener()......花了我一段时间,我希望我能节省你的时间
    • 6 年过去了,这仍然是最好的答案。 Google 尚未解决此问题。
    【解决方案2】:

    为了从 SearchView.OnCloseListener 调用 onClose() 方法。我使它以下列方式工作。 将此添加到您的搜索视图

    searchView.setIconifiedByDefault(true);
    searchView.setOnCloseListener(this);
    

    现在实现这个 onclick 监听器

      searchView.findViewById(R.id.search_close_btn)
                    .setOnClickListener(new View.OnClickListener() {
                        @Override
                    public void onClick(View v) {
                        Log.d("called","this is called.");
                        searchView.setQuery("",false);
                        searchView.setIconified(true);
    
                    }
                });
    

    这对我有用。分享,以便它也可以帮助其他人。 谢谢

    【讨论】:

      【解决方案3】:

      好的。我弄错了。我们不能添加一个 searchCommand 并做

      setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)
      

      这样做会删除 searchText(如果有的话),因此我们不能执行 onClose()。

      【讨论】:

        【解决方案4】:

        为了在单击“x”图标时收到通知,我在 SearchView 的“x”按钮上添加了一个单击监听器。

        通过 id 找到 SearchView 'x' 按钮并附加 OnClickListener:

        mSearchView.findViewById(R.id.search_close_btn)
            .setOnClickListener(this);
        

        视图 search_close_btn 存在于 Android 框架提供的 SearchView 布局中。

        【讨论】:

          【解决方案5】:
              MenuItemCompat.OnActionExpandListener expandListener = new MenuItemCompat.OnActionExpandListener() {
                  @Override
                  public boolean onMenuItemActionCollapse(MenuItem item) {
                      // Do something when action item collapses
                      /*Hiding the mic on search visibility*/
                          myMenu.findItem(R.id.action_speak).setVisible(false);
                      Log.v("test","colllapse");
                      return true;  // Return true to collapse action view
                  }
          
                  @Override
                  public boolean onMenuItemActionExpand(MenuItem item) {
                      // Do something when expanded
                      Log.v("test","expand");
                      return true;  // Return true to expand action view
                  }
              };
          
              //Searchview Initilisation
              MenuItem searchViewItem = menu.findItem(R.id.action_search);
              // Assign the listener to that action item
              MenuItemCompat.setOnActionExpandListener(searchViewItem, expandListener);
          

          更多信息来自这里:https://developer.android.com/training/appbar/action-views.html

          【讨论】:

          • 这可以从一些额外的解释中受益。
          【解决方案6】:

          我为解决类似问题所做的是创建了一个扩展 SearchView 的新类:

          public class EnglishVerbSearchView extends SearchView {
          
          OnSearchViewCollapsedEventListener mSearchViewCollapsedEventListener;
          
          public EnglishVerbSearchView(Context context) {
              super(context);
          }
          
          @Override
          public void onActionViewCollapsed() {
              if (mSearchViewCollapsedEventListener != null)
                  mSearchViewCollapsedEventListener.onSearchViewCollapsed();
              super.onActionViewCollapsed();
          }
          
          public interface OnSearchViewCollapsedEventListener{
              public void onSearchViewCollapsed();
          }
          
          public void setOnSearchViewCollapsedEventListener(OnSearchViewCollapsedEventListener eventListener) {
              mSearchViewCollapsedEventListener = eventListener;
          }
          
          }
          

          然后您可以在菜单 xml 文件中使用此类而不是 SearchView:

          <?xml version="1.0" encoding="utf-8"?>
          <menu xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
              <item android:id="@+id/action_search"
                android:title="@string/action_search"
                android:icon="@drawable/action_search"
                yourapp:showAsAction="ifRoom|collapseActionView"
                yourapp:actionViewClass="com.szymontrapp.englishverbs.EnglishVerbSearchView" />
          </menu>
          

          然后你可以在你的活动中添加一个监听器:

              getMenuInflater().inflate(R.menu.dictionary, menu);
              MenuItem searchItem = menu.findItem(R.id.action_search);
              EnglishVerbSearchView searchView = (EnglishVerbSearchView)      MenuItemCompat.getActionView(searchItem);       
          
              // Get the SearchView and set the searchable configuration
              SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
              // Assumes current activity is the searchable activity
              searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
              searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
          
              searchView.setOnSearchViewCollapsedEventListener(listener);
          

          您还可以覆盖类中替代 SearchView 的其他方法以实现其他目标。

          【讨论】:

          【解决方案7】:

          创建将app:showAsAction 设置为always 的菜单项。

          <item   
           android:id="@+id/action_search"  
           android:title="..."  
           android:icon="..."  
           app:actionViewClass="android.support.v7.widget.SearchView"  
           app:showAsAction="always"/>
          

          onCreateOptionsMenu 方法中创建SearchView 时,请执行以下操作

          inflater.inflate(R.menu.menu_search, menu);
          final MenuItem item = menu.findItem(R.id.action_search);
          final SearchView search = (SearchView) item.getActionView();
          search.setQueryHint(getString(R.string.search_brand_item));
          search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
              // add your code
              return false;
            }
          
            @Override
            public boolean onQueryTextChange(String newText) {
              // add your code 
              return false;
            }
          });
          search.setOnCloseListener(new SearchView.OnCloseListener() {
            @Override
            public boolean onClose() {
              // add your code here
              return false;
            }
          });
          search.setIconifiedByDefault(true); // make sure to set this to true
          

          search.setIconifiedByDefault(true) 需要设置为true,才能在上面创建的SearchView.OnCloseListener() 上调用onClose() 方法。

          【讨论】:

            【解决方案8】:

            我也发现了这个问题。解决方法很简单!只需将您的 SearchView 视图存储在私有变量中。然后使用

            • isShown 检查视图是否展开的方法,
            • searchview.addOnLayoutChange 确定 searchview 在 if 阻止后开始使用 isShown
            • 使用 if block(searchView !=null &amp;&amp; searchView.isShown() 覆盖 onBackPressed,然后在用户单击返回按钮时执行您的操作,
            • 并用isShown 块覆盖onOptionsItemSelected 中的home(back) 按钮侦听器。 注意:在菜单项 xml 文件中删除 app:showAsAction collapseActionView 标志。

            【讨论】:

              【解决方案9】:

              如果你设置了

              searchView.setIconifiedByDefault(false)
              

              然后,您的 searchView 永远不会关闭,因为它始终处于展开模式。这就是你的 onClose() 没有被调用的原因。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-11-15
                • 1970-01-01
                • 1970-01-01
                • 2018-11-25
                • 2019-03-31
                • 2012-12-16
                • 2015-03-28
                • 2016-06-10
                相关资源
                最近更新 更多