Bạn nên sử dụng tiện ích SearchView làm một mục trong thanh ứng dụng để cung cấp chức năng tìm kiếm trong ứng dụng. Giống như tất cả các mục trong thanh ứng dụng, bạn có thể xác định SearchView để luôn hiển thị hoặc chỉ hiển thị khi có chỗ. Bạn cũng có thể xác định đây là một thao tác có thể thu gọn, ban đầu sẽ hiển thị SearchView dưới dạng biểu tượng, sau đó chiếm toàn bộ thanh ứng dụng dưới dạng một trường tìm kiếm khi người dùng nhấn vào biểu tượng.
Thêm SearchView vào thanh ứng dụng
Để thêm một tiện ích SearchView vào thanh ứng dụng, hãy tạo một tệp trong dự án có tên res/menu/options_menu.xml rồi thêm đoạn mã sau vào tệp đó. Mã này xác định cách tạo mục tìm kiếm, chẳng hạn như biểu tượng cần dùng và tiêu đề của mục. Thuộc tính collapseActionView cho phép SearchView mở rộng để chiếm toàn bộ thanh ứng dụng và thu gọn lại thành một mục thanh ứng dụng bình thường khi không sử dụng. Do không gian thanh ứng dụng hạn chế trên các thiết bị cầm tay, bạn nên sử dụng thuộc tính collapsibleActionView để mang lại trải nghiệm tốt hơn cho người dùng.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/ic_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="androidx.appcompat.widget.SearchView" /> </menu>
Nếu bạn muốn có một biểu tượng tìm kiếm dễ tiếp cận hơn, hãy tạo tệp ic_search.xml trong thư mục /res/drawable và thêm đoạn mã sau vào tệp đó:
<vector android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/> </vector>
Để hiển thị SearchView trong thanh ứng dụng, hãy tăng tài nguyên trình đơn XML res/menu/options_menu.xml trong phương thức onCreateOptionsMenu() của hoạt động:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) return true }
Khi chạy ứng dụng, bạn sẽ thấy như sau:
SearchView xuất hiện trong thanh ứng dụng của ứng dụng, nhưng không hoạt động. Nếu nhấn vào biểu tượng tìm kiếm, bạn sẽ thấy như sau:
SearchView đang hoạt động.
Để SearchView hoạt động, bạn phải xác định cách SearchView hoạt động.
Tạo cấu hình tìm kiếm
Cấu hình tìm kiếm chỉ định cách SearchView hoạt động và được xác định trong tệp res/xml/searchable.xml. Cấu hình tìm kiếm phải chứa ít nhất một thuộc tính android:label có cùng giá trị với thuộc tính android:label của phần tử <application> hoặc <activity> trong tệp kê khai Android. Tuy nhiên, bạn cũng nên thêm thuộc tính android:hint để cho người dùng biết họ nên nhập nội dung gì vào hộp tìm kiếm.
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" />
Trong tệp kê khai của ứng dụng, hãy khai báo một phần tử <meta-data> trỏ đến tệp res/xml/searchable.xml. Khai báo phần tử trong một <activity> mà bạn muốn hiển thị SearchView.
<activity android:name=".SearchResultsActivity" android:exported="false" android:label="@string/title_activity_search_results" android:launchMode="singleTop" android:theme="@style/Theme.AppCompat.Light"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity>
Trong phương thức onCreateOptionsMenu() mà bạn tạo, hãy liên kết cấu hình tìm kiếm với SearchView bằng cách gọi setSearchableInfo(SearchableInfo):
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager val searchView = menu.findItem(R.id.search).actionView as SearchView val component = ComponentName(this, SearchResultsActivity::class.java) val searchableInfo = searchManager.getSearchableInfo(component) searchView.setSearchableInfo(searchableInfo) return true }
Lệnh gọi đến getSearchableInfo() sẽ lấy một đối tượng SearchableInfo được tạo từ tệp XML cấu hình tìm kiếm. Khi cấu hình tìm kiếm được liên kết chính xác với SearchView và người dùng gửi một cụm từ tìm kiếm, SearchView sẽ bắt đầu một hoạt động bằng ý định ACTION_SEARCH. Sau đó, bạn cần một hoạt động có thể lọc ý định này và xử lý cụm từ tìm kiếm.
Tạo một hoạt động có thể tìm kiếm
Một bộ lọc hoạt động có thể tìm kiếm cho ý định ACTION_SEARCH và tìm kiếm cụm từ tìm kiếm trong một tập dữ liệu. Để tạo một hoạt động có thể tìm kiếm, hãy khai báo một hoạt động mà bạn chọn để lọc theo ý định ACTION_SEARCH:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
Trong hoạt động có thể tìm kiếm, hãy xử lý ý định ACTION_SEARCH bằng cách kiểm tra ý định đó trong phương thức onCreate().
Kotlin
class SearchResultsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_search_results) handleIntent(intent) } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { if (Intent.ACTION_SEARCH == intent.action) { val query = intent.getStringExtra(SearchManager.QUERY) Log.d("SEARCH", "Search query was: $query") } } }
Giờ đây, SearchView có thể chấp nhận câu hỏi của người dùng và bắt đầu hoạt động có thể tìm kiếm bằng ý định ACTION_SEARCH.
Sau khi nhận được cụm từ tìm kiếm, bạn có thể truyền cụm từ đó đến ViewModel. Tại đây, bạn có thể sử dụng cụm từ đó trong các lớp khác của cấu trúc để truy xuất kết quả tìm kiếm cần hiển thị.