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

问题描述:

我已经在操作栏中实现了一个android搜索视图。当搜索视图获得焦点时,右侧的关闭按钮[x]出现。我查看了其他Android本机应用程序,如联系人和Gmail。当搜索视图获得焦点时,关闭按钮不显示。 如何设置我的搜索视图的行为是这样的?[Android搜索窗口小部件]如何在默认情况下隐藏搜索视图中的关闭按钮?

我面临与android.support.v7.widget.SearchView相同的问题,并找到了解决方案。首先,在onCreateOptionsMenu,您可以获取对搜索查看参考以及其关闭按钮:

@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会重置其关闭按钮的可见性。所以我的解决方案是使用一个透明的绘制和禁用关闭按钮的点击:

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

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

然而,这是相当哈克说实话。从https://android.googlesource.com/platform/frameworks/support.git/+/master/v7/appcompat/src/android/support/v7/widget/SearchView.java获取SearchView源并创建您自己的SearchView版本可以隐藏/显示关闭按钮,这样做会更清晰。

更新:
谷歌刚刚宣布程序兼容性V21,其对于搜索查看小部件的造型改进:
http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

+1

感谢。我不得不从searchview中删除关闭按钮。首先,我尝试使用'mSearchCloseButton.setVisibility(View.GONE)',但它不起作用。然后我试着设置一个像你一样透明的drawable,并让我的目的得到满足。 – 2015-09-20 11:54:56

你可以从搜索查看对象按钮链接(程序兼容性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.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.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); 
    } 
}); 
+0

的作品真的很不错! – 2016-09-10 14:22:58

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

您也可以使用这个隐藏关闭按钮

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