Tạo giao diện tìm kiếm

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ẩn EditText 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.

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ếmtì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:

  1. Khai báo hoạt động để chấp nhận ý định ACTION_SEARCH trong một <intent-filter> .
  2. 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"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:

  1. Nhận truy vấn.
  2. Tìm kiếm dữ liệu của bạn.
  3. Trình bày kết quả.

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>

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 đến onCreate(), 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 ý định ACTION_SEARCH bằng một cuộc gọi đến onNewIntent(Intent), truyền ý định ACTION_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ả hai onCreate()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ậy getIntent() phương thức này trả về cùng một ý định nhận được với onCreate(). Đây là lý do tại sao bạn phải gọi setIntent(Intent) bên trong onNewIntent(Intent): để ý định được lưu được cập nhật phòng khi bạn gọi getIntent() 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

Hình 1. Tiện ích SearchViewdướ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ếmhoạ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ọi setIconified().

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.