Android SearchView 控件

在Android开发中,SearchView是一个非常常见的控件,它提供了一个文本框和一个搜索按钮,方便用户进行搜索操作。本文将介绍SearchView控件的用法,并提供相应的代码示例。

SearchView的基本用法

导入SearchView控件

首先,在XML布局文件中添加SearchView控件:

<SearchView
    android:id="@+id/search_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

然后,在Activity中获取SearchView实例,设置相应的监听器:

SearchView searchView = findViewById(R.id.search_view);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        // 当用户点击搜索按钮时触发
        doSearch(query);
        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        // 当搜索框中的文本发生变化时触发
        return false;
    }
});

处理搜索事件

onQueryTextSubmit方法中,我们可以处理用户点击搜索按钮时的逻辑。比如,将搜索关键字传递给后台服务器进行搜索,或者直接在本地数据库中进行搜索。

private void doSearch(String keyword) {
    // 处理搜索逻辑
}

自定义SearchView样式

SearchView控件还支持自定义样式。可以通过修改searchViewStyle属性来改变SearchView的外观,如下所示:

<style name="AppSearchViewStyle" parent="Widget.AppCompat.SearchView">
    <item name="searchIcon">@drawable/ic_search</item>
    <item name="closeIcon">@drawable/ic_close</item>
    <item name="queryBackground">@drawable/bg_search_text</item>
    <item name="submitBackground">@drawable/bg_search_submit</item>
    <item name="searchHintIcon">@drawable/ic_search_hint</item>
    <item name="searchHintTextColor">#999999</item>
</style>

然后,在SearchView的布局文件中引用该样式:

<SearchView
    ...
    style="@style/AppSearchViewStyle"/>

SearchView的高级用法

设置搜索提示

SearchView控件还支持设置搜索提示,帮助用户更快地找到想要的结果。可以通过setSuggestionsAdapter方法来设置搜索提示的数据源。

SearchView searchView = findViewById(R.id.search_view);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
CursorAdapter suggestionAdapter = new SimpleCursorAdapter(
        this,
        android.R.layout.simple_list_item_1,
        null,
        new String[]{SearchManager.SUGGEST_COLUMN_TEXT_1},
        new int[]{android.R.id.text1},
        CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
searchView.setSuggestionsAdapter(suggestionAdapter);

然后,在onQueryTextChange方法中,根据用户输入的关键字查询匹配的搜索提示,并更新数据源。

@Override
public boolean onQueryTextChange(String newText) {
    Cursor cursor = getSuggestions(newText);
    suggestionAdapter.changeCursor(cursor);
    return true;
}

private Cursor getSuggestions(String keyword) {
    // 根据关键字查询匹配的搜索提示
    // 返回Cursor对象
}

设置搜索历史

SearchView控件还支持设置搜索历史,方便用户查看之前的搜索记录。可以通过setOnSuggestionListener方法来监听搜索历史的点击事件。

searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
    @Override
    public boolean onSuggestionSelect(int position) {
        // 当用户点击搜索历史记录时触发
        return true;
    }

    @Override
    public boolean onSuggestionClick(int position) {
        // 当用户点击搜索历史记录时触发
        String suggestion = getSuggestion(position);
        searchView.setQuery(suggestion, false);
        doSearch(suggestion);
        return true;
    }
});

onSuggestionClick方法中,我们可以将点击的搜索历史记录作为关键字,进行搜索操作。

高级搜索功能

SearchView控件还支持高级搜索功能,比如范围搜索、条件搜索等。可以通过自定义搜索界面来实现这些功能。

searchView.setOnSearchClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 打开自定义搜索界面
        openAdvancedSearch();
    }
});