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à một giao diện người dùng do hệ thống cung cấp và phủ lên trên ứng dụng khi được gọi.
Đặt các cấp độ API mục tiêu và tối thiể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 phiên bản Android 3.0 trở lên. Khi bạn thực hiện việc này, ứng dụng của bạn 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 thiết bị cũ
Để kích hoạt 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 trong 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 trong 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 của thiết bị để đảm bảo rằng 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 tôi, điều 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; }