Khả năng tương thích ngược còn lại
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Thử cách dùng Compose
Jetpack Compose là bộ công cụ giao diện người dùng được đề xuất cho Android. Tìm hiểu cách thêm chức năng tìm kiếm trong Compose.
SearchView
và thanh thao tác chỉ có trên Android 3.0 trở lên. Để hỗ trợ các nền tảng cũ, bạn có thể quay lại hộp thoại tìm kiếm. Hộp thoại tìm kiếm là giao diện người dùng do hệ thống cung cấp, lớp phủ trên ứng dụng của bạn khi được gọi.
Đặt cấp độ API tối thiểu và mục tiêu
Để thiết lập hộp thoại tìm kiếm, trước tiên, hãy khai báo trong tệp kê khai rằng bạn muốn hỗ trợ các thiết bị cũ, nhưng muốn nhắm đến các phiên bản Android 3.0 trở lên. Khi bạn thực hiện việc này, ứng dụng sẽ tự động sử dụng thanh thao tác trên Android 3.0 trở lên và sử dụng hệ thống trình đơn truyền thống trên các thiết bị cũ:
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />
<application>
...
Cung cấp Hộp thoại tìm kiếm cho các thiết bị cũ
Để gọi hộp thoại tìm kiếm trên các thiết bị cũ, hãy gọi onSearchRequested()
mỗi khi người dùng chọn mục trình đơn tìm kiếm trong trình đơn tuỳ chọn. Vì các thiết bị Android 3.0 trở lên hiển thị SearchView
trong thanh thao tác (như minh hoạ trong bài học đầu tiên), nên chỉ các phiên bản cũ hơn 3.0 mới gọi onOptionsItemSelected()
khi người dùng chọn mục trình đơn tìm kiếm.
Kotlin
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.search -> {
onSearchRequested()
true
}
else -> false
}
}
Java
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
onSearchRequested();
return true;
default:
return false;
}
}
Kiểm tra Phiên bản bản dựng Android trong thời gian chạy
Trong thời gian chạy, hãy kiểm tra phiên bản thiết bị để đảm bảo việc sử dụng SearchView
không được hỗ trợ không xảy ra trên các thiết bị cũ. Trong mã ví dụ của chúng ta, việc này xảy ra trong phương thức onCreateOptionsMenu()
:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.options_menu, menu)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
(menu.findItem(R.id.search).actionView as SearchView).apply {
setSearchableInfo(searchManager.getSearchableInfo(componentName))
setIconifiedByDefault(false)
}
}
return true
}
Java
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
}
return true;
}
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-08-23 UTC.
[null,null,["Cập nhật lần gần đây nhất: 2025-08-23 UTC."],[],[],null,["# Remaining Backward Compatible\n\nTry the Compose way \nJetpack Compose is the recommended UI toolkit for Android. Learn how to add search functionality in Compose. \n[Filter a list →](/develop/ui/compose/quick-guides/content/filter-list-while-typing) \n\nThe [SearchView](/reference/android/widget/SearchView) and action bar are only available on Android 3.0 and\nlater. To support older platforms, you can fall back to the search dialog. The search dialog is a\nsystem provided UI that overlays on top of your application when invoked.\n\nSet Minimum and Target API levels\n---------------------------------\n\nTo setup the search dialog, first declare in your manifest that you want to support older\ndevices, but want to target Android 3.0 or later versions. When you do this, your application\nautomatically uses the action bar on Android 3.0 or later and uses the traditional menu system on\nolder devices: \n\n```xml\n\u003cuses-sdk android:minSdkVersion=\"7\" android:targetSdkVersion=\"15\" /\u003e\n\n\u003capplication\u003e\n...\n```\n\nProvide the Search Dialog for Older Devices\n-------------------------------------------\n\nTo invoke the search dialog on older devices, call [onSearchRequested()](/reference/android/app/Activity#onSearchRequested()) whenever a user selects the search\nmenu item from the options menu. Because Android 3.0 and higher devices show the\n[SearchView](/reference/android/widget/SearchView) in the action bar (as demonstrated in the first lesson), only versions\nolder than 3.0 call [onOptionsItemSelected()](/reference/android/app/Activity#onOptionsItemSelected(android.view.MenuItem)) when the\nuser selects the search menu item. \n\n### Kotlin\n\n```kotlin\noverride fun onOptionsItemSelected(item: MenuItem): Boolean {\n return when (item.itemId) {\n R.id.search -\u003e {\n onSearchRequested()\n true\n }\n else -\u003e false\n }\n}\n```\n\n### Java\n\n```java\n@Override\npublic boolean onOptionsItemSelected(MenuItem item) {\n switch (item.getItemId()) {\n case R.id.search:\n onSearchRequested();\n return true;\n default:\n return false;\n }\n}\n```\n\nCheck the Android Build Version at Runtime\n------------------------------------------\n\nAt runtime, check the device version to make sure an unsupported use of [SearchView](/reference/android/widget/SearchView) does not occur on older devices. In our example code, this happens in\nthe [onCreateOptionsMenu()](/reference/android/app/Activity#onCreateOptionsMenu(android.view.Menu)) method: \n\n### Kotlin\n\n```kotlin\noverride fun onCreateOptionsMenu(menu: Menu): Boolean {\n\n menuInflater.inflate(R.menu.options_menu, menu)\n\n if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.HONEYCOMB) {\n val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager\n (menu.findItem(R.id.search).actionView as SearchView).apply {\n setSearchableInfo(searchManager.getSearchableInfo(componentName))\n setIconifiedByDefault(false)\n }\n }\n return true\n}\n```\n\n### Java\n\n```java\n@Override\npublic boolean onCreateOptionsMenu(Menu menu) {\n\n MenuInflater inflater = getMenuInflater();\n inflater.inflate(R.menu.options_menu, menu);\n\n if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.HONEYCOMB) {\n SearchManager searchManager =\n (SearchManager) getSystemService(Context.SEARCH_SERVICE);\n SearchView searchView =\n (SearchView) menu.findItem(R.id.search).getActionView();\n searchView.setSearchableInfo(\n searchManager.getSearchableInfo(getComponentName()));\n searchView.setIconifiedByDefault(false);\n }\n return true;\n}\n```"]]