【问题标题】:Android search widget How to hide the close button in search view by default?Android搜索小部件如何默认隐藏搜索视图中的关闭按钮?
【发布时间】:2014-09-19 09:12:48
【问题描述】:

我在ActionBar 中实现了一个android SearchView。当SearchView 获得焦点时,右侧的关闭按钮 [x] 会出现。我查看了其他 android 原生应用程序,例如联系人和 Gmail。当SearchView 获得焦点时,关闭按钮不显示。

如何设置我的SearchView 的行为?

【问题讨论】:

    标签: android android-widget searchview


    【解决方案1】:

    设置searchView.setIconifiedByDefault(false) 将禁用折叠搜索视图并移除关闭按钮。

    【讨论】:

      【解决方案2】:

      我在android.support.v7.widget.SearchView 上遇到了同样的问题并找到了解决方案。首先,在onCreateOptionsMenu 中,您可以获得对 SearchView 及其关闭按钮的引用:

      @Override
      public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
          super.onCreateOptionsMenu(menu, inflater);
          inflater.inflate(R.menu.search, menu);
      
          MenuItem searchItem = menu.findItem(R.id.action_search);
          mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
      
          try {
              Field searchField = SearchView.class.getDeclaredField("mCloseButton");
              searchField.setAccessible(true);
              mSearchCloseButton = (ImageView) searchField.get(mSearchView);
          } catch (Exception e) {
              Log.e(TAG, "Error finding close button", e);
          }
      }
      

      现在您可以尝试修改按钮。首先,我尝试使用setVisibility(View.GONE) 隐藏关闭按钮,但这不起作用,因为当用户与 SearchView 交互时,SearchView 会重置其关闭按钮的可见性。所以我的解决方案是使用透明的drawable并禁用关闭按钮的点击:

      if (mSearchCloseButton != null) {
          mSearchCloseButton.setEnabled(false);
          mSearchCloseButton.setImageDrawable(getResources().getDrawable(R.drawable.transparent));
      }
      

      这篇文章对我也有帮助:
      http://novoda.com/blog/styling-actionbar-searchview

      但是,老实说,这很 hacky。从https://android.googlesource.com/platform/frameworks/support.git/+/master/v7/appcompat/src/android/support/v7/widget/SearchView.java 获取 SearchView 源代码并创建您自己的 SearchView 版本来隐藏/显示关闭按钮会更干净。

      更新:
      Google 刚刚发布了 AppCompat v21,它对 SearchView 小部件的样式进行了改进:
      http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

      【讨论】:

      • 谢谢。我不得不从搜索视图中删除关闭按钮。首先我尝试了mSearchCloseButton.setVisibility(View.GONE),但它没有用。然后我尝试设置一个像你一样透明的drawable,并达到我的目的。
      【解决方案3】:

      你也可以用它来隐藏关闭按钮

      ImageView closeBtn = (ImageView) searchView.findViewById(R.id.search_close_btn);
      closeBtn.setEnabled(false);
      closeBtn.setImageDrawable(null);
      

      【讨论】:

        【解决方案4】:

        您可以从 SearchView 对象 (AppCompat v23.2.1) 中获取到按钮的链接:

        searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
        ImageView mCloseButton = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
        

        然后您可以为 SearchView 文本更改分配一个侦听器(SearchView 也会更改按钮的可见性,但侦听器将在之后执行并覆盖这些更改):

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
        
            @Override
            public boolean onQueryTextChange(String newText) {
                mCloseButton.setVisibility(newText.isEmpty() ? View.GONE : View.VISIBLE);
                return false;
            }
        });
        

        最后,当 SearchView 从图标化状态展开时隐藏图标的监听器:

        searchView.setOnSearchClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // hide "x" button if there is no text
                String query = searchView.getQuery().toString();
                mCloseButton.setVisibility(query.isEmpty() ? View.GONE : View.VISIBLE);
            }
        });
        

        【讨论】:

          【解决方案5】:

          为未来的访客发帖。以前的答案很旧而且不容易。您所要做的就是将 null 设置为 app:closeIcon 这样app:closeIcon="@null"

            <androidx.appcompat.widget.SearchView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              app:closeIcon="@null"   <!-- This simple solution -->
              app:iconifiedByDefault="false" />
          

          【讨论】:

            【解决方案6】:

            使用AndroidXandroid.support.v7.appcompat.R.id.search_close_btn 将不起作用

            这样就可以了,

            app:closeIcon="@null"
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-11-08
              • 1970-01-01
              • 1970-01-01
              • 2020-05-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多