Android搜索小部件如何默认隐藏搜索视图中的关闭按钮?

13

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

如何设置我的SearchView表现得像那样?

6个回答

15

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


12

我曾经遇到和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源代码,并创建自己的版本,在其中实现关闭按钮的隐藏/显示。

更新:
谷歌刚刚宣布了AppCompat v21,该版本对SearchView小部件进行了样式改进:
http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html


1
谢谢。我不得不从searchview中删除关闭按钮。首先,我尝试使用mSearchCloseButton.setVisibility(View.GONE),但它没有起作用。然后我尝试设置一个透明的drawable,就像你做的那样,我的目的得到了实现。 - Reaz Murshed

10

为了方便未来的访客,本文提供最新易懂的翻译。解决方法是将 app:closeIcon 设为 null,即 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" />

9
你可以使用这个方法来隐藏关闭按钮。
ImageView closeBtn = (ImageView) searchView.findViewById(R.id.search_close_btn);
closeBtn.setEnabled(false);
closeBtn.setImageDrawable(null);

8
你可以从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);
    }
});

1
使用AndroidX,android.support.v7.appcompat.R.id.search_close_btn将无法使用。
这样做就可以了:
app:closeIcon="@null"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接