Khi bạn đã sẵn sàng thêm chức năng tìm kiếm vào ứng dụng của mình, Android sẽ giúp bạn triển khai giao diện người dùng với hộp thoại tìm kiếm xuất hiện ở trên cùng của cửa sổ hoạt động hoặc tiện ích tìm kiếm mà bạn có thể chèn vào bố cục của mình. Cả hộp thoại tìm kiếm và tiện ích đều có thể cung cấp truy vấn tìm kiếm của người dùng tới hoạt động cụ thể trong ứng dụng của bạn. Bằng cách này, người dùng có thể bắt đầu tìm kiếm từ bất kỳ hoạt động có sẵn hộp thoại hoặc tiện ích tìm kiếm và hệ thống khởi động hoạt động thích hợp để thực hiện tìm kiếm và trình bày kết quả.
Các tính năng khác có sẵn cho hộp thoại và tiện ích tìm kiếm bao gồm:
- Tìm kiếm bằng giọng nói
- Cụm từ tìm kiếm được đề xuất dựa trên các cụm từ tìm kiếm gần đây
- Cụm từ tìm kiếm được đề xuất khớp với kết quả thực tế trong dữ liệu ứng dụng của bạn
Tài liệu này cho biết cách thiết lập ứng dụng để cung cấp giao diện tìm kiếm được hệ thống Android hỗ trợ để phân phối truy vấn tìm kiếm, sử dụng hộp thoại tìm kiếm hoặc tiện ích tìm kiếm.
Tài nguyên liên quan:
Thông tin cơ bản
Trước khi bạn bắt đầu, hãy quyết định xem bạn có muốn triển khai giao diện tìm kiếm của mình hay không thông qua hộp thoại tìm kiếm hoặc tiện ích tìm kiếm. Chúng cung cấp cùng một nội dung tìm kiếm nhưng theo những cách hơi khác nhau:
- Hộp thoại tìm kiếm là thành phần giao diện người dùng do
hệ thống Android. Khi được người dùng kích hoạt, hộp thoại tìm kiếm sẽ xuất hiện tại
phần đầu của hoạt động.
Hệ thống Android kiểm soát tất cả sự kiện trong hộp thoại tìm kiếm. Khi người dùng gửi truy vấn, hệ thống sẽ phân phối truy vấn đó đến hoạt động bạn chỉ định để xử lý các tìm kiếm. Hộp thoại cũng có thể cung cấp công cụ tìm kiếm các đề xuất trong khi người dùng nhập.
- Tiện ích tìm kiếm là một phiên bản của
SearchView
mà bạn có thể đặt vào bất kỳ vị trí nào trong bố cục. Theo mặc định, tiện ích tìm kiếm hoạt động như chuẩnEditText
một tiện ích con và không thực hiện bất kỳ thao tác nào, nhưng bạn có thể định cấu hình nó để Android hệ thống xử lý tất cả sự kiện đầu vào, phân phối truy vấn đến hoạt động và cung cấp các đề xuất tìm kiếm—giống như tìm kiếm .
Khi người dùng tìm kiếm trong hộp thoại tìm kiếm hoặc một tiện ích tìm kiếm,
hệ thống sẽ tạo ra một
Intent
và
sẽ lưu trữ truy vấn của người dùng trong đó. Sau đó, hệ thống sẽ khởi động hoạt động mà bạn
khai báo để xử lý các tìm kiếm—"hoạt động có thể tìm kiếm"—và phân phối hoạt động đó
ý định. Để thiết lập ứng dụng của mình cho loại tìm kiếm được hỗ trợ này, bạn cần
sau:
- Cấu hình tìm kiếm
- Tệp XML định cấu hình một số chế độ cài đặt cho hộp thoại hoặc tiện ích tìm kiếm. Giao diện này bao gồm các chế độ cài đặt cho các tính năng như tìm kiếm bằng giọng nói, đề xuất tìm kiếm, và gợi ý cho hộp tìm kiếm.
- Một hoạt động có thể tìm kiếm
Activity
nhận cụm từ tìm kiếm, tìm kiếm dữ liệu của bạn và hiển thị cụm từ tìm kiếm kết quả.- Giao diện tìm kiếm, được cung cấp bởi một trong hai yếu tố sau:
- Hộp thoại tìm kiếm
- Theo mặc định, hộp thoại tìm kiếm sẽ bị ẩn. Nó xuất hiện ở đầu trên màn hình khi bạn gọi
onSearchRequested()
khi người dùng nhấn vào nút Tìm kiếm.- Một
SearchView
tiện ích- Việc sử dụng tiện ích tìm kiếm cho phép bạn đặt hộp tìm kiếm ở bất cứ đâu trong hoạt động, bao gồm chế độ xem hành động trong thanh ứng dụng.
- Một
Phần còn lại của tài liệu này chỉ cho bạn cách tạo cấu hình tìm kiếm và hoạt động có thể tìm kiếm được cũng như cách triển khai giao diện tìm kiếm với hộp thoại tìm kiếm hoặc tiện ích tìm kiếm.
Tạo một cấu hình có thể tìm kiếm được
Thứ đầu tiên bạn cần là một tệp XML có tên là
cấu hình tìm kiếm.
Định cấu hình một số khía cạnh giao diện người dùng của hộp thoại hoặc tiện ích tìm kiếm và xác định cách thức
chẳng hạn như đề xuất và tìm kiếm bằng giọng nói. Thông thường, tệp này là
có tên là searchable.xml
và phải được lưu trong res/xml/
thư mục dự án.
Tệp cấu hình tìm kiếm phải bao gồm
<searchable>
làm nút gốc và chỉ định một hoặc nhiều thuộc tính như được minh hoạ trong
ví dụ sau:
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_label" android:hint="@string/search_hint" > </searchable>
Thuộc tính android:label
là thuộc tính bắt buộc duy nhất. Nó
trỏ đến một tài nguyên chuỗi và phải là tên ứng dụng. Nhãn này không
hiển thị cho người dùng cho đến khi bạn bật đề xuất tìm kiếm cho Hộp Tìm kiếm Nhanh, tại
điểm nào có thể hiển thị nhãn trong danh sách các Mục có thể tìm kiếm trong hệ thống
phần cài đặt.
Mặc dù không bắt buộc nhưng bạn nên luôn thêm
Thuộc tính android:hint
, cung cấp một chuỗi gợi ý trong phần tìm kiếm
trước khi người dùng nhập truy vấn. Gợi ý quan trọng vì nó cung cấp
các gợi ý quan trọng cho người dùng về nội dung họ có thể tìm kiếm.
Phần tử <searchable>
chấp nhận một số thuộc tính khác.
Tuy nhiên, bạn không cần hầu hết các thuộc tính cho đến khi thêm các tính năng như
đề xuất tìm kiếm và
tìm kiếm bằng giọng nói. Để biết thông tin chi tiết về
tệp cấu hình tìm kiếm, hãy xem
Cấu hình tìm kiếm
tài liệu tham khảo.
Tạo một hoạt động có thể tìm kiếm
Một hoạt động có thể tìm kiếm là Activity
trong ứng dụng của bạn và hoạt động đó mang lại hiệu quả
tìm kiếm dựa trên chuỗi truy vấn và trình bày kết quả tìm kiếm.
Khi người dùng thực hiện một lượt tìm kiếm trong hộp thoại hoặc tiện ích tìm kiếm, hệ thống
bắt đầu hoạt động có thể tìm kiếm của bạn và cung cấp cho hoạt động đó cụm từ tìm kiếm trong một
Intent
bằng
ACTION_SEARCH
hành động. Hoạt động có thể tìm kiếm của bạn sẽ truy xuất truy vấn từ
QUERY
sau đó tìm kiếm dữ liệu của bạn và trình bày kết quả.
Vì bạn có thể đưa hộp thoại tìm kiếm hoặc tiện ích vào bất kỳ hoạt động nào khác trong ứng dụng của bạn, hệ thống phải biết hoạt động nào là hoạt động có thể tìm kiếm để có thể cung cấp đúng cụm từ tìm kiếm. Vì vậy, trước tiên hãy khai báo khả năng tìm kiếm hoạt động trong tệp kê khai Android.
Khai báo hoạt động có thể tìm kiếm
Nếu bạn chưa có tệp nào, hãy tạo một Activity
có hiệu suất
tìm kiếm và trình bày kết quả. Bạn không cần phải triển khai tính năng tìm kiếm
Bạn chỉ cần tạo một hoạt động mà bạn có thể khai báo trong
tệp kê khai. Bên trong tệp kê khai
<activity>
, hãy làm như sau:
- Khai báo hoạt động để chấp nhận ý định
ACTION_SEARCH
trong một<intent-filter>
. - Chỉ định cấu hình tìm kiếm để sử dụng trong một
<meta-data>
.
Lệnh này được minh hoạ trong ví dụ sau:
<application ... > <activity android:name=".SearchableActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> ... </application>
Phần tử <meta-data>
phải bao gồm
Thuộc tính android:name
có giá trị là
"android.app.searchable"
và android:resource
có tham chiếu đến tệp cấu hình có thể tìm kiếm được. Trong
ví dụ trước, nó đề cập đến res/xml/searchable.xml
.
Thực hiện tìm kiếm
Sau khi bạn khai báo hoạt động có thể tìm kiếm trong tệp kê khai, hãy làm theo hướng dẫn sau để thực hiện tìm kiếm trong hoạt động có thể tìm kiếm của bạn:
Nhận yêu cầu
Khi người dùng thực hiện tìm kiếm từ hộp thoại hoặc tiện ích tìm kiếm, hệ thống
bắt đầu hoạt động có thể tìm kiếm của bạn và gửi ACTION_SEARCH
cho hoạt động đó
ý định. Ý định này mang cụm từ tìm kiếm trong chuỗi QUERY
khác. Kiểm tra ý định này khi hoạt động bắt đầu và trích xuất chuỗi.
Ví dụ: dưới đây là cách bạn có thể nhận được cụm từ tìm kiếm khi
hoạt động bắt đầu:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.search) // Verify the action and get the query. if (Intent.ACTION_SEARCH == intent.action) { intent.getStringExtra(SearchManager.QUERY)?.also { query -> doMySearch(query) } } }
Java
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); // Get the intent, verify the action, and get the query. Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doMySearch(query); } }
Chuỗi QUERY
luôn đi kèm với
Ý định ACTION_SEARCH
. Trong ví dụ trước, truy vấn là
đã truy xuất và truyền đến phương thức doMySearch()
cục bộ mà trong đó
thao tác tìm kiếm thực tế được thực hiện.
Tìm dữ liệu của bạn
Chỉ có ứng dụng của bạn mới có quy trình lưu trữ và tìm kiếm dữ liệu. Bạn có thể lưu trữ và tìm kiếm dữ liệu của bạn theo nhiều cách và tài liệu này không hướng dẫn bạn cách thực hiện. Xem xét cách bạn lưu trữ và tìm kiếm dữ liệu theo nhu cầu và dữ liệu của bạn . Sau đây là các mẹo bạn có thể áp dụng:
- Nếu dữ liệu của bạn được lưu trữ trong cơ sở dữ liệu SQLite trên thiết bị, hãy thực hiện
tìm kiếm toàn bộ văn bản – sử dụng FTS3 thay vì
LIKE
truy vấn—có thể cung cấp tìm kiếm mạnh mẽ hơn trên dữ liệu văn bản và có thể cho kết quả nhanh hơn đáng kể. Xem sqlite.org cho thông tin về FTS3 vàSQLiteDatabase
để biết thông tin về SQLite trên Android. - Nếu dữ liệu của bạn được lưu trữ trực tuyến, thì hiệu suất tìm kiếm cảm nhận được có thể
bị hạn chế bởi kết nối dữ liệu của người dùng. Bạn có thể muốn hiển thị
chỉ báo tiến trình cho đến khi tìm kiếm của bạn trở lại. Xem
android.net
để tham khảo các API mạng vàProgressBar
để biết thông tin về cách hiển thị chỉ báo tiến trình.
Trình bày kết quả
Bất kể dữ liệu của bạn nằm ở đâu và bạn tìm kiếm dữ liệu đó bằng cách nào, chúng tôi khuyên bạn
bạn trả về kết quả tìm kiếm cho hoạt động có thể tìm kiếm của bạn bằng một
Adapter
. Chiến dịch này
bạn có thể trình bày tất cả kết quả tìm kiếm trong một
RecyclerView
.
Nếu dữ liệu của bạn đến từ truy vấn cơ sở dữ liệu SQLite, bạn có thể áp dụng kết quả của mình cho một truy vấn
RecyclerView
sử dụng
CursorAdapter
Nếu dữ liệu của bạn có định dạng khác, bạn có thể tạo tiện ích mở rộng
BaseAdapter
.
Adapter
liên kết mỗi mục từ một tập dữ liệu thành một
Đối tượng View
. Thời gian
Adapter
được áp dụng cho RecyclerView
, mỗi phần
được chèn vào dưới dạng chế độ xem riêng lẻ vào danh sách. Adapter
là
chỉ một giao diện, vì vậy, việc triển khai như
CursorAdapter
– để liên kết dữ liệu từ
Cursor
—là
cần thiết. Nếu không có cách triển khai hiện tại nào phù hợp với dữ liệu của bạn, thì bạn có thể
hãy triển khai mã của riêng bạn từ BaseAdapter
.
Sử dụng hộp thoại tìm kiếm
Hộp thoại tìm kiếm cung cấp một hộp tìm kiếm nổi ở đầu màn hình, bằng biểu tượng ứng dụng ở bên trái. Hộp thoại tìm kiếm có thể cung cấp cụm từ tìm kiếm được đề xuất khi người dùng nhập. Khi người dùng thực hiện tìm kiếm, hệ thống sẽ gửi cụm từ tìm kiếm truy vấn vào một hoạt động có thể tìm kiếm thực hiện việc tìm kiếm.
Theo mặc định, hộp thoại tìm kiếm luôn bị ẩn cho đến khi người dùng kích hoạt nó.
Ứng dụng của bạn có thể kích hoạt hộp thoại tìm kiếm bằng cách gọi
onSearchRequested()
. Tuy nhiên, phương pháp này không hiệu quả cho đến khi bạn
bật hộp thoại tìm kiếm cho hoạt động.
Để cho phép hộp thoại tìm kiếm thực hiện tìm kiếm, hãy cho hệ thống biết
hoạt động có thể tìm kiếm phải nhận các cụm từ tìm kiếm từ hộp thoại tìm kiếm. Cho
ví dụ, trong phần trước về
tạo một hoạt động có thể tìm kiếm,
hoạt động có tên SearchableActivity
sẽ được tạo. Nếu bạn muốn một
hoạt động riêng biệt, chẳng hạn như hoạt động có tên OtherActivity
, để hiển thị
hộp thoại tìm kiếm và gửi tìm kiếm tới SearchableActivity
, khai báo
trong tệp kê khai rằng SearchableActivity
là hoạt động có thể tìm kiếm
để sử dụng cho hộp thoại tìm kiếm trong OtherActivity
.
Để khai báo hoạt động có thể tìm kiếm cho hộp thoại tìm kiếm của một hoạt động, hãy thêm thuộc tính
Phần tử <meta-data>
bên trong hoạt động tương ứng
Phần tử <activity>
. <meta-data>
phải bao gồm thuộc tính android:value
chỉ định
tên lớp của hoạt động có thể tìm kiếm và thuộc tính android:name
có giá trị "android.app.default_searchable"
.
Ví dụ: đây là nội dung khai báo cho cả hoạt động có thể tìm kiếm,
SearchableActivity
và một hoạt động khác,
OtherActivity
, sử dụng SearchableActivity
để
thực hiện các lượt tìm kiếm được thực thi từ hộp thoại tìm kiếm:
<application ... > <!-- This is the searchable activity; it performs searches. --> <activity android:name=".SearchableActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> <!-- This activity enables the search dialog to initiate searches in the SearchableActivity. --> <activity android:name=".OtherActivity" ... > <!-- Enable the search dialog to send searches to SearchableActivity. --> <meta-data android:name="android.app.default_searchable" android:value=".SearchableActivity" /> </activity> ... </application>
Vì OtherActivity
hiện bao gồm một
Phần tử <meta-data>
để khai báo hoạt động có thể tìm kiếm nào
sử dụng để tìm kiếm, hoạt động sẽ kích hoạt hộp thoại tìm kiếm. Mặc dù người dùng
trong hoạt động này, phương thức onSearchRequested()
sẽ kích hoạt
hộp thoại tìm kiếm. Khi người dùng thực hiện tìm kiếm, hệ thống sẽ khởi động
SearchableActivity
và phân phối ACTION_SEARCH
ý định.
Nếu bạn muốn mọi hoạt động trong ứng dụng cung cấp hộp thoại tìm kiếm, hãy chèn
phần tử <meta-data>
đứng trước làm phần tử con của
<application>
thay vì mỗi <activity>
. Bằng cách này, mọi hoạt động
kế thừa giá trị, cung cấp hộp thoại tìm kiếm và phân phối tìm kiếm đến
cùng một hoạt động có thể tìm kiếm. Nếu có nhiều hoạt động có thể tìm kiếm, bạn có thể
ghi đè hoạt động có thể tìm kiếm mặc định bằng cách đặt một
Nội dung khai báo <meta-data>
bên trong từng hoạt động riêng lẻ.
Khi hộp thoại tìm kiếm hiện được bật cho hoạt động của bạn, ứng dụng của bạn sẽ sẵn sàng để thực hiện tìm kiếm.
Gọi hộp thoại tìm kiếm
Mặc dù một số thiết bị cung cấp nút tìm kiếm chuyên dụng, nhưng hành vi của
nút có thể khác nhau giữa các thiết bị và nhiều thiết bị không cung cấp tính năng tìm kiếm
nút nào. Vì vậy, khi sử dụng hộp thoại tìm kiếm, bạn phải cung cấp nút tìm kiếm
trong giao diện người dùng để kích hoạt hộp thoại tìm kiếm bằng cách gọi
onSearchRequested()
.
Ví dụ: thêm một nút tìm kiếm trong
trình đơn tuỳ chọn hoặc bố cục giao diện người dùng
gọi onSearchRequested()
.
Bạn cũng có thể bật tính năng "nhập để tìm kiếm" , chức năng này sẽ kích hoạt
hộp thoại tìm kiếm khi người dùng bắt đầu nhập trên bàn phím. Tổ hợp phím là
được chèn vào hộp thoại tìm kiếm. Bạn có thể bật tính năng nhập để tìm kiếm trong hoạt động của mình
bằng cách gọi điện
setDefaultKeyMode
— hoặc
DEFAULT_KEYS_SEARCH_LOCAL
—trong thời gian
của hoạt động của bạn
onCreate()
.
Tác động của hộp thoại tìm kiếm đối với vòng đời hoạt động
Hộp thoại tìm kiếm là một
Dialog
nổi
ở đầu màn hình. Điều này không gây ra bất kỳ thay đổi nào trong ngăn xếp hoạt động, vì vậy
khi hộp thoại tìm kiếm xuất hiện, sẽ không có phương thức nào trong vòng đời (chẳng hạn như
onPause()
—là
có tên. Hoạt động của bạn mất tiêu điểm nhập vì tiêu điểm nhập được cấp cho
hộp thoại tìm kiếm.
Nếu bạn muốn được thông báo khi hộp thoại tìm kiếm được kích hoạt, hãy ghi đè
onSearchRequested()
. Khi hệ thống gọi phương thức này, nó
là dấu hiệu cho biết hoạt động của bạn mất tiêu điểm nhập vào hộp thoại tìm kiếm, vì vậy
bạn có thể làm mọi việc phù hợp với sự kiện này, chẳng hạn như tạm dừng một trò chơi. Trừ phi
bạn đang chuyển ngữ cảnh tìm kiếm
—được thảo luận trong một phần khác của tài liệu này—kết thúc
bằng cách gọi phương thức triển khai lớp cấp cao:
Kotlin
override fun onSearchRequested(): Boolean { pauseSomeStuff() return super.onSearchRequested() }
Java
@Override public boolean onSearchRequested() { pauseSomeStuff(); return super.onSearchRequested(); }
Nếu người dùng nhấn vào nút Quay lại để huỷ tìm kiếm, thì hộp thoại tìm kiếm sẽ xuất hiện
đóng và hoạt động lấy lại tiêu điểm nhập. Bạn có thể đăng ký nhận thông báo
khi bạn đóng hộp thoại tìm kiếm bằng
setOnDismissListener()
,
setOnCancelListener()
,
hoặc cả hai. Bạn chỉ cần đăng ký
OnDismissListener
,
vì lệnh này được gọi mỗi khi hộp thoại tìm kiếm đóng. Chiến lược phát hành đĩa đơn
OnCancelListener
chỉ liên quan đến các sự kiện mà người dùng thoát khỏi hộp thoại tìm kiếm một cách rõ ràng, vì vậy
hệ thống sẽ không gọi lệnh khi thao tác tìm kiếm được thực thi. Khi việc tìm kiếm được thực thi,
hộp thoại tìm kiếm tự động biến mất.
Nếu hoạt động hiện tại không phải là hoạt động có thể tìm kiếm, thì hoạt động thông thường
Các sự kiện trong vòng đời hoạt động được kích hoạt khi người dùng thực thi một sự kiện
tìm kiếm— hoạt động hiện tại nhận được onPause()
, như được mô tả
trong Giới thiệu về
hoạt động. Tuy nhiên, nếu hoạt động hiện tại là hoạt động có thể tìm kiếm,
thì một trong hai điều sau sẽ xảy ra:
- Theo mặc định, hoạt động có thể tìm kiếm sẽ nhận được
Ý định
ACTION_SEARCH
có lệnh gọi đếnonCreate()
, và một thực thể mới của hoạt động được đưa lên đầu hoạt động ngăn xếp. Hiện có hai trường hợp hoạt động có thể tìm kiếm của bạn trong ngăn xếp hoạt động, vì vậy nhấn vào nút Quay lại sẽ đưa bạn trở lại hoạt động trước đó của hoạt động có thể tìm kiếm thay vì thoát khỏi thuộc tính có thể tìm kiếm của bạn. - Nếu bạn đặt
android:launchMode
thành"singleTop"
, thì hoạt động có thể tìm kiếm sẽ nhận ý địnhACTION_SEARCH
bằng một cuộc gọi đếnonNewIntent(Intent)
, truyền ý địnhACTION_SEARCH
mới. Ví dụ: dưới đây là cách bạn có thể xử lý trường hợp này, trong đó chế độ chạy của hoạt động có thể tìm kiếm là"singleTop"
:Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.search) handleIntent(intent) } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) setIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { if (Intent.ACTION_SEARCH == intent.action) { intent.getStringExtra(SearchManager.QUERY)?.also { query -> doMySearch(query) } } }
Java
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doMySearch(query); } }
So sánh với mã ví dụ trong phần về tìm kiếm, thì tất cả mã để xử lý mục đích tìm kiếm hiện nằm trong phương thức
handleIntent()
để cả haionCreate()
vàonNewIntent()
có thể thực thi lệnh này.Khi hệ thống gọi
onNewIntent(Intent)
, hoạt động sẽ không đã khởi động lại, vì vậygetIntent()
phương thức này trả về cùng một ý định nhận được vớionCreate()
. Đây là lý do tại sao bạn phải gọisetIntent(Intent)
bên trongonNewIntent(Intent)
: để ý định được lưu được cập nhật phòng khi bạn gọigetIntent()
trong tương lai.
Trường hợp thứ hai, sử dụng chế độ chạy "singleTop"
, thường là
thích hợp hơn, vì sau khi hoàn tất tìm kiếm, người dùng có thể thực hiện thêm
các lượt tìm kiếm và bạn không muốn ứng dụng của mình tạo nhiều phiên bản của
hoạt động có thể tìm kiếm. Bạn nên đặt hoạt động có thể tìm kiếm thành
Chế độ chạy "singleTop"
trong tệp kê khai ứng dụng, như minh hoạ trong
ví dụ sau:
<activity android:name=".SearchableActivity" android:launchMode="singleTop" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity>
Truyền dữ liệu về bối cảnh tìm kiếm
Trong một số trường hợp, bạn có thể thực hiện các tinh chỉnh cần thiết đối với truy vấn tìm kiếm bên trong
hoạt động có thể tìm kiếm cho mọi tìm kiếm đã thực hiện. Tuy nhiên, nếu bạn muốn tinh chỉnh
tiêu chí tìm kiếm của bạn dựa trên hoạt động mà từ đó người dùng thực hiện một
tìm kiếm, bạn có thể cung cấp dữ liệu bổ sung trong ý định mà hệ thống gửi đến
hoạt động có thể tìm kiếm của bạn. Bạn có thể chuyển dữ liệu bổ sung trong
APP_DATA
Bundle
, tức là
có trong ý định ACTION_SEARCH
.
Để chuyển loại dữ liệu này sang hoạt động có thể tìm kiếm của bạn, hãy ghi đè
Phương thức onSearchRequested()
cho hoạt động mà từ đó người dùng có thể
thực hiện tìm kiếm, tạo Bundle
với dữ liệu bổ sung và
cuộc gọi
startSearch()
để kích hoạt hộp thoại tìm kiếm. Ví dụ:
Kotlin
override fun onSearchRequested(): Boolean { val appData = Bundle().apply { putBoolean(JARGON, true) } startSearch(null, false, appData, false) return true }
Java
@Override public boolean onSearchRequested() { Bundle appData = new Bundle(); appData.putBoolean(SearchableActivity.JARGON, true); startSearch(null, false, appData, false); return true; }
Trả về true cho biết bạn đã xử lý thành công sự kiện gọi lại này và
gọi startSearch()
để kích hoạt hộp thoại tìm kiếm. Sau người dùng
gửi một truy vấn, truy vấn đó được gửi tới hoạt động có thể tìm kiếm của bạn cùng với dữ liệu
bạn thêm. Bạn có thể trích xuất dữ liệu bổ sung từ APP_DATA
Bundle
để tinh chỉnh kết quả tìm kiếm, như trong ví dụ sau:
Kotlin
val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false
Java
Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA); if (appData != null) { boolean jargon = appData.getBoolean(SearchableActivity.JARGON); }
Sử dụng tiện ích tìm kiếm
![Hình ảnh cho thấy chế độ xem tìm kiếm trong thanh trên cùng của ứng dụng](https://developer.android.com/static/images/ui/search-ui-topbar-33.png?hl=vi)
Hình 1. Tiện ích SearchView
dưới dạng
chế độ xem hành động trong thanh ứng dụng.
Tiện ích tìm kiếm cung cấp chức năng tương tự như hộp thoại tìm kiếm. Nó bắt đầu hoạt động thích hợp khi người dùng thực hiện một tìm kiếm và hoạt động này có thể cung cấp đề xuất tìm kiếm và thực hiện tìm kiếm bằng giọng nói. Nếu đó không phải là một tuỳ chọn cho bạn đặt tiện ích tìm kiếm vào thanh ứng dụng, thay vào đó bạn có thể đặt công cụ tìm kiếm tiện ích cụ thể nào đó trong bố cục hoạt động của bạn.
Định cấu hình tiện ích tìm kiếm
Sau khi bạn tạo một
cấu hình tìm kiếm và
hoạt động có thể tìm kiếm, bật tính năng tìm kiếm được hỗ trợ
cho mỗi SearchView
bằng cách gọi
setSearchableInfo()
và truyền vào đó đối tượng SearchableInfo
đại diện cho
cấu hình có thể tìm kiếm được.
Bạn có thể tham chiếu đến SearchableInfo
bằng cách gọi
getSearchableInfo()
về
SearchManager
.
Ví dụ: nếu bạn đang sử dụng SearchView
làm chế độ xem hành động trong
thanh ứng dụng, bật tiện ích này trong khi
onCreateOptionsMenu()
như trong ví dụ sau:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the options menu from XML. val inflater = menuInflater inflater.inflate(R.menu.options_menu, menu) // Get the SearchView and set the searchable configuration. val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager (menu.findItem(R.id.menu_search).actionView as SearchView).apply { // Assumes current activity is the searchable activity. setSearchableInfo(searchManager.getSearchableInfo(componentName)) setIconifiedByDefault(false) // Don't iconify the widget. Expand it by default. } return true }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the options menu from XML. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); // Get the SearchView and set the searchable configuration. SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); // Assumes current activity is the searchable activity. searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); // Don't iconify the widget. Expand it by default. return true; }
Tiện ích tìm kiếm hiện đã được định cấu hình và hệ thống phân phối các cụm từ tìm kiếm vào hoạt động có thể tìm kiếm. Bạn cũng có thể bật đề xuất tìm kiếm cho tiện ích tìm kiếm.
Để biết thêm thông tin về khung hiển thị hành động trong thanh ứng dụng, hãy xem Sử dụng chế độ xem hành động và hành động .
Các tính năng khác của tiện ích Tìm kiếm
Tiện ích SearchView
cung cấp thêm một số tính năng
có thể muốn:
- Nút gửi
- Theo mặc định, không có nút nào để gửi cụm từ tìm kiếm, vì vậy người dùng phải
nhấn phím Return trên bàn phím để bắt đầu tìm kiếm. Bạn
có thể thêm phần "gửi" bằng cách gọi
setSubmitButtonEnabled(true)
. - Tinh chỉnh cụm từ tìm kiếm cho cụm từ tìm kiếm được đề xuất
- Khi bật tính năng đề xuất tìm kiếm, bạn thường mong muốn người dùng chọn một
nhưng cũng có thể muốn tinh chỉnh cụm từ tìm kiếm đề xuất.
Bạn có thể thêm một nút bên cạnh mỗi đề xuất có chèn gợi ý đó
vào hộp tìm kiếm để tinh chỉnh bởi người dùng bằng cách gọi
setQueryRefinementEnabled(true)
. - Bật/tắt chế độ hiển thị hộp tìm kiếm
- Theo mặc định, tiện ích tìm kiếm được "biểu tượng" có nghĩa là
chỉ được thể hiện bằng biểu tượng tìm kiếm — kính lúp. Tên này mở rộng thành
hiển thị hộp tìm kiếm khi người dùng nhấn vào biểu tượng. Như được trình bày trong phần trước
ví dụ: bạn có thể hiển thị hộp tìm kiếm theo mặc định bằng cách gọi
setIconifiedByDefault(false)
. Bạn cũng có thể bật/tắt giao diện tiện ích tìm kiếm bằng cách gọisetIconified()
.
Có một số API khác trong lớp SearchView
cho phép
bạn tùy chỉnh tiện ích tìm kiếm. Tuy nhiên, hầu hết các phương thức này chỉ được dùng khi bạn
tự xử lý mọi hoạt động đầu vào của người dùng thay vì sử dụng hệ thống Android để phân phối
cụm từ tìm kiếm và hiển thị đề xuất tìm kiếm.
Sử dụng cả tiện ích và hộp thoại
Nếu bạn chèn tiện ích tìm kiếm vào thanh ứng dụng dưới dạng một
chế độ xem hành động và bật
nó sẽ xuất hiện trong thanh ứng dụng nếu có chỗ—theo cài đặt
android:showAsAction="ifRoom"
– thì tiện ích tìm kiếm có thể
không xuất hiện dưới dạng chế độ xem hành động. Thay vào đó, một mục trong trình đơn có thể xuất hiện trong mục bổ sung
. Ví dụ: khi ứng dụng của bạn chạy trên một màn hình nhỏ hơn, có thể không có
đủ khoảng trống trong thanh ứng dụng để hiển thị tiện ích tìm kiếm cùng với hành động khác
các mục hoặc phần tử điều hướng, vì vậy mục trong trình đơn sẽ xuất hiện trong mục bổ sung
. Khi được đặt vào trình đơn mục bổ sung, mục này sẽ hoạt động như một trình đơn thông thường
và không hiển thị chế độ xem hành động, tức là tiện ích tìm kiếm.
Để xử lý trường hợp này, mục trong trình đơn mà bạn đính kèm tiện ích tìm kiếm
phải kích hoạt hộp thoại tìm kiếm khi người dùng chọn hộp thoại đó từ trình đơn mục bổ sung.
Để làm được điều này, hãy triển khai
onOptionsItemSelected()
để xử lý yêu cầu "Tìm kiếm" và mở hộp thoại tìm kiếm bằng cách gọi
onSearchRequested()
Để biết thêm thông tin về cách hoạt động của các mục trong thanh ứng dụng và cách xử lý trong trường hợp này, hãy xem Thêm thanh ứng dụng.
Thêm tính năng tìm kiếm bằng giọng nói
Bạn có thể thêm chức năng tìm kiếm bằng giọng nói vào hộp thoại hoặc tiện ích tìm kiếm bằng cách
đang thêm thuộc tính android:voiceSearchMode
vào danh sách có thể tìm kiếm
. Thao tác này sẽ thêm một nút tìm kiếm bằng giọng nói để chạy một lời nhắc bằng giọng nói.
Khi người dùng nói xong, cụm từ tìm kiếm được chép lời sẽ được gửi đến
hoạt động có thể tìm kiếm.
Lệnh này được minh hoạ trong ví dụ sau:
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search_label" android:hint="@string/search_hint" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" > </searchable>
Giá trị showVoiceSearchButton
là bắt buộc để bật giọng nói
tìm kiếm. Giá trị thứ hai, launchRecognizer
, chỉ định rằng
nút tìm kiếm bằng giọng nói phải khởi chạy trình nhận dạng trả về
văn bản được chép lời vào hoạt động có thể tìm kiếm.
Bạn có thể cung cấp các thuộc tính bổ sung để chỉ định hành vi tìm kiếm bằng giọng nói, chẳng hạn như ngôn ngữ dự kiến và số lượng kết quả tối đa cần trả về. Xem tài liệu tham khảo Cấu hình tìm kiếm để biết thêm thông tin về các thuộc tính hiện có.
Thêm cụm từ tìm kiếm được đề xuất
Cả hộp thoại tìm kiếm và tiện ích tìm kiếm đều có thể cung cấp cụm từ tìm kiếm được đề xuất khi người dùng nhập, với sự hỗ trợ của hệ thống Android. Hệ thống quản lý danh sách các đề xuất và xử lý sự kiện khi người dùng chọn một .
Bạn có thể cung cấp hai loại cụm từ tìm kiếm được đề xuất:
- Cụm từ tìm kiếm được đề xuất gần đây
- Những đề xuất này là các từ mà người dùng trước đây đã sử dụng để tìm kiếm trong ứng dụng của bạn. Xem Thêm cụm từ tìm kiếm tuỳ chỉnh được đề xuất để biết thêm thông tin.
- Cụm từ tìm kiếm được đề xuất tuỳ chỉnh
- Đây là những cụm từ tìm kiếm được đề xuất mà bạn cung cấp từ nguồn dữ liệu của bạn để giúp người dùng chọn ngay lập tức đúng chính tả hoặc đúng mục mà họ đang tìm kiếm cho. Xem bài viết Thêm nội dung tìm kiếm tuỳ chỉnh đề xuất để biết thêm thông tin.