详细解读android中的搜索框——searchview

  • Post category:other

详细解读Android中的搜索框——SearchView

SearchView是Android中常用的搜索框控件,它可以方便地实现搜索功能。本文将详细解读Android中的SearchView控件包括SearchView的基本用法、属性、事件和两个示例说明。

1. SearchView的基本用法

在布局文件中SearchView控件,如下所示:

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

在Activity中获取SearchView控件,并设置监听器,如下所示:

SearchView searchView = findViewById(R.id.search_view);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        // 处理搜索事件
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        // 处理搜索框文本变化事件
        return false;
    }
});

在onQueryTextSubmit方法中处理搜索事件,在onQueryTextChange方法中处理搜索框文本变化事件。

2. SearchView的属性

SearchView的常用属性如下:

  • android:iconByDefault:设置搜索框是否默认显示搜索图标。
  • android:queryHint:设置搜索框中的提示文本。
  • android:imeOptions:设置输入法选项,如“搜索”、“完成”等。
  • app:searchIcon:设置搜索图标。
    -:closeIcon:设置关闭图标。
  • app:voiceIcon:设置语音输入图标。
  • app:goIcon:设置“前往”图标。
  • app:searchHintIcon:设置搜索框提示文本前面的图标。

3. SearchView的事件

SearchView的常用事件如下:

  • setOnQueryTextListener:设置搜索框文本变化和搜索事件监听器。
  • setOnCloseListener:设置搜索框关闭事件监听器。
  • setOnSuggestionListener:设置搜索建议列表事件监听器。

4. 示例说明

以下是两个使用SearchView的示例说明:

示例1:搜索联系人

假设我们需要在Android应用中搜索联系人。我们可以使用SearchView控件来实现。以下是示例代码:

public class MainActivity extends AppCompatActivity {

    private List<String> contacts = new ArrayList<>();
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化联系人列表
        for (int i = 0; i < 20; i++) {
            contacts.add("Contact " + i);
        }

        // 初始化ListView
        ListView listView = findViewById(R.id.list_view);
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, contacts);
        listView.setAdapter(adapter);

        // 初始化SearchView
        SearchView searchView = findViewById(R.id.search_view);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return false;
            }
        });
    }
}

在这个示例中,我们在Activity中初始化了联系人列表和ListView控件。然后,我们在Activity中获取SearchView控件,并设置监听器。在监听器中,我们使用ArrayAdapter的getFilter方法来过滤联系人列表,以实现搜索功能。

示例2:搜索电影

假设我们在Android应用中搜索电影。我们可以使用SearchView控件和网络请求来实现。以下是示例代码:

public class MainActivity extends AppCompatActivity {

    private List<Movie> movies = new ArrayList<>();
    private RecyclerView recyclerView;
    private MovieAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化RecyclerView
        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new MovieAdapter(movies);
        recyclerView.setAdapter(adapter);

        // 初始化SearchView
        SearchView searchView = findViewById(R.id.search_view);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                searchMovies(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
    }

    private void searchMovies(String query) {
        // 发送网络请求,获取电影列表
        String url = "https://api.douban.com/v2/movie/search?q=" + query;
        RequestQueue queue = Volley.newRequestQueue(this);
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray array = response.getJSONArray("subjects");
                            movies.clear();
                            for (int i = 0; i < array.length(); i++) {
                                JSONObject object = array.getJSONObject(i);
                                String title = object.getString("title");
                                String imageUrl = object.getJSONObject("images").getString("small");
                                Movie movie = new Movie(title, imageUrl);
                                movies.add(movie);
                            }
                            adapter.notifyDataSetChanged();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });
        queue.add(request);
    }
}

在这个示例中,我们在Activity中初始化了RecyclerView控件和MovieAdapter适配器。然后,我们在Activity中获取SearchView控件,并设置监听器。在监听器中,我们使用Volley库发送请求,获取电影列表,并使用MovieAdapter适配器来显示电影列表。