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

Android搜索小部件如何在默认情况下隐藏搜索视图中的关闭按钮?,android,android-widget,searchview,Android,Android Widget,Searchview,我在ActionBar中实现了一个安卓SearchView。当SearchView获得焦点时,右侧的关闭按钮[x]会出现。我看了一下其他android原生应用程序,比如Contacts和Gmail。当搜索视图获得焦点时,关闭按钮不显示。 如何设置我的SearchView的行为方式?我在android.support.v7.widget.SearchView上遇到了同样的问题,并找到了解决方案。首先,在创建选项菜单中,您可以获得对SearchView及其关闭按钮的引用: @Override pub

我在
ActionBar
中实现了一个安卓
SearchView
。当
SearchView
获得焦点时,右侧的关闭按钮[x]会出现。我看了一下其他android原生应用程序,比如Contacts和Gmail。当
搜索视图获得焦点时,关闭按钮不显示。


如何设置我的
SearchView
的行为方式?

我在
android.support.v7.widget.SearchView上遇到了同样的问题,并找到了解决方案。首先,在创建选项菜单中,您可以获得对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);
    }
}
if (mSearchCloseButton != null) {
    mSearchCloseButton.setEnabled(false);
    mSearchCloseButton.setImageDrawable(getResources().getDrawable(R.drawable.transparent));
}
现在您可以尝试修改按钮。首先,我尝试使用
setVisibility(View.GONE)
隐藏关闭按钮,但这不起作用,因为当用户与SearchView交互时,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);
    }
}
if (mSearchCloseButton != null) {
    mSearchCloseButton.setEnabled(false);
    mSearchCloseButton.setImageDrawable(getResources().getDrawable(R.drawable.transparent));
}
这篇文章也帮助了我:

然而,老实说,这是相当骇人听闻的。从中获取SearchView源代码并创建您自己的版本的SearchView(隐藏/显示关闭按钮)会更干净

更新:
谷歌刚刚发布了AppCompat v21,它改进了SearchView小部件的样式:

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

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

最后,当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);
    }
});

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

您也可以使用此选项隐藏关闭按钮

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

为未来的访客张贴。以前的答案很老,也不容易。您所要做的就是将null设置为
app:closeIcon
,这样
app:closeIcon=“@null”


使用
AndroidX
android.support.v7.appcompat.R.id.search\u close\u btn
将无法工作

这样就行了

app:closeIcon="@null"

谢谢我不得不从searchview中删除关闭按钮。首先,我尝试了
mSearchCloseButton.setVisibility(View.GONE)
,但没有成功。然后,我试着设置一个像你们一样透明的可拉丝,并且达到了我的目的。
app:closeIcon="@null"