如何在清除不可折叠的SearchView时执行搜索?

时间:2015-01-26 13:59:21

标签: android searchview

SearchView是一个设计标准,但有一个bug,其中OnCloseListener(我通常将代码搜索而不进行过滤)不会被调用。
> 如果您只想在onQueryTextSubmit而不是onQueryTextChange中执行搜索,则会出现此问题 当查询字符串为空时,不会调用前者,并且我不想在用户删除它时仅搜索其他内容时进行搜索 - 只有在故意删除文本过滤时才会进行搜索。

我正在使用setIconifiedByDefault(true),因为设计需要一个始终可见的搜索栏 - 但即使不是这种情况,onClose()仅在您'图标化'SearchView时调用< strong> second 点击'x'图标。

什么是最好的解决方案?最好不要在SearchView等上添加自定义视图

1 个答案:

答案 0 :(得分:0)

解决方法:创建覆盖SearchView的自己的视图,按下时执行搜索。仅在搜索字符串为空但最后执行的搜索使用非空字符串时才可见(否则不需要)。

<RelativeLayout>
    <SearchView
        android:id="@+id/search" />
    <ImageView
        android:id="@+id/clear"
        android:layout_width="@dimen/someValue"
        android:layout_height="0dip"
        android:layout_alignTop="@id/search"
        android:layout_alignBottom="@id/search"
        android:layout_alignRight="@id/search"
        android:scaleType="fitCenter"
        android:visibility="gone"
        android:src="@drawable/someIcon" />
</RelativeLayout>
// assign to the overlaying ImageView
class OnClearClickListener implements View.OnClickListener{
    @Override
    public final void onClick(View v) {
        View clear = findViewById(R.id.clear);
        clear.setVisibility(View.GONE); // hide, just did its job
        performSearch();
    }
}
// assign to SearchView
class OnFilterQueryTextListener implements OnQueryTextListener {
    @Override
    public boolean onQueryTextChange(String newText) {
        boolean hide = newText != null && newText.length() > 0 ||
            !lastSearchUsedFilter(); // check value stored on successful response
        findViewById(R.id.clear).setVisibility(hide ? View.GONE : View.VISIBLE);
        return false;
    }
    @Override
    public boolean onQueryTextSubmit(String query) {
        findViewById(R.id.clear).setVisibility(View.GONE);
        performSearch();
        return false;
    }

});