详细解读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适配器来显示电影列表。