เพิ่มการแนะนำการค้นหาที่กำหนดเอง

ลองใช้วิธีแบบ Compose
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนำสำหรับ Android ดูวิธีเพิ่มฟังก์ชันการค้นหาใน Compose

คุณสามารถแสดงคำแนะนำการค้นหาตามคำค้นหาล่าสุดในกล่องโต้ตอบการค้นหาหรือวิดเจ็ตการค้นหาของ Android ตัวอย่างเช่น หากผู้ใช้ค้นหาคำว่า "ลูกสุนัข" คำค้นหาดังกล่าวจะปรากฏเป็นคำแนะนำเมื่อผู้ใช้พิมพ์คำค้นหาเดียวกันอีกครั้ง รูปที่ 1 แสดงตัวอย่างกล่องโต้ตอบการค้นหาพร้อมคำแนะนำคำค้นหาล่าสุด

ก่อนเริ่มต้น ให้ใช้กล่องโต้ตอบการค้นหาหรือวิดเจ็ตการค้นหาสำหรับการค้นหาพื้นฐานในแอปพลิเคชัน ดูวิธีใช้งานได้ที่ สร้างอินเทอร์เฟซการค้นหา

ข้อมูลเบื้องต้น

รูปที่ 1 ภาพหน้าจอของกล่องโต้ตอบการค้นหาพร้อมคำแนะนำคำค้นหาล่าสุด

คำแนะนำคำค้นหาล่าสุดคือการค้นหาที่บันทึกไว้ เมื่อผู้ใช้เลือกคำแนะนำ กิจกรรมที่ค้นหาได้จะได้รับ Intent ACTION_SEARCH พร้อมคำแนะนำเป็นคำค้นหาที่กิจกรรมที่ค้นหาได้จัดการอยู่แล้ว

หากต้องการแสดงคำแนะนำคำค้นหาล่าสุด คุณต้องทำดังนี้

  • ใช้กิจกรรมที่ค้นหาได้
  • สร้างผู้ให้บริการเนื้อหาที่ขยาย SearchRecentSuggestionsProvider และประกาศในไฟล์ Manifest ของแอปพลิเคชัน
  • แก้ไขการกำหนดค่าที่ค้นหาได้ด้วยข้อมูลเกี่ยวกับผู้ให้บริการเนื้อหาที่แสดง คำแนะนำการค้นหา
  • บันทึกคำค้นหาลงในผู้ให้บริการเนื้อหาทุกครั้งที่ทำการค้นหา

ระบบ Android จะแสดงคำแนะนำการค้นหาใต้กล่องโต้ตอบหรือวิดเจ็ตการค้นหา เช่นเดียวกับที่แสดงกล่องโต้ตอบการค้นหา คุณเป็นผู้ระบุแหล่งที่มาที่ระบบจะดึงคำแนะนำ

เมื่อระบบระบุว่ากิจกรรมของคุณค้นหาได้และแสดงคำแนะนำการค้นหา สิ่งต่อไปนี้จะเกิดขึ้นเมื่อผู้ใช้พิมพ์คำค้นหา

  1. ระบบจะนำข้อความคำค้นหา ซึ่งก็คือข้อความใดก็ตามที่ผู้ใช้เริ่มพิมพ์ แล้ว ทำการค้นหาผู้ให้บริการเนื้อหาที่มีคำแนะนำ
  2. ผู้ให้บริการเนื้อหาจะแสดง Cursor ที่ชี้ไปยังคำแนะนำทั้งหมดที่ตรงกับข้อความคำค้นหา
  3. ระบบจะแสดงรายการคำแนะนำที่ Cursor ให้ไว้

เมื่อแสดงคำแนะนำคำค้นหาล่าสุดแล้ว สิ่งต่อไปนี้อาจเกิดขึ้น

  • หากผู้ใช้พิมพ์คีย์อื่นหรือเปลี่ยนคำค้นหาไม่ว่าด้วยวิธีใดก็ตาม ระบบจะทำซ้ำขั้นตอนก่อนหน้าและอัปเดตรายการคำแนะนำ
  • หากผู้ใช้ทำการค้นหา ระบบจะข้ามคำแนะนำและส่งการค้นหาไปยัง กิจกรรมที่ค้นหาได้โดยใช้ Intent ตามปกติACTION_SEARCH
  • หากผู้ใช้เลือกคำแนะนำ ระบบจะส่ง Intent ACTION_SEARCH ไปยังกิจกรรมที่ค้นหาได้ โดยใช้ข้อความที่แนะนำเป็นคำค้นหา

คลาส SearchRecentSuggestionsProvider ที่คุณขยายสำหรับผู้ให้บริการเนื้อหาจะทำงานในขั้นตอนก่อนหน้าโดยอัตโนมัติ คุณจึงต้องเขียนโค้ดเพียงเล็กน้อย

สร้างผู้ให้บริการเนื้อหา

ผู้ให้บริการเนื้อหาที่คุณต้องใช้สำหรับคำแนะนำคำค้นหาล่าสุดคือการใช้งาน SearchRecentSuggestionsProvider คลาสนี้จะจัดการทุกอย่างให้คุณ คุณเพียงแค่เขียนเครื่องมือสร้างคลาสที่เรียกใช้โค้ด 1 บรรทัด

ตัวอย่างเช่น นี่คือการใช้งานผู้ให้บริการเนื้อหาสำหรับคำแนะนำคำค้นหาล่าสุดอย่างสมบูรณ์

Kotlin

class MySuggestionProvider : SearchRecentSuggestionsProvider() {
    init {
        setupSuggestions(AUTHORITY, MODE)
    }

    companion object {
        const val AUTHORITY = "com.example.MySuggestionProvider"
        const val MODE: Int = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES
    }
}

Java

public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = "com.example.MySuggestionProvider";
    public final static int MODE = DATABASE_MODE_QUERIES;

    public MySuggestionProvider() {
        setupSuggestions(AUTHORITY, MODE);
    }
}

การเรียก setupSuggestions() จะส่งชื่อของสิทธิ์การค้นหาและโหมดฐานข้อมูล สิทธิ์การค้นหาอาจเป็นสตริงที่ไม่ซ้ำกัน แต่แนวทางปฏิบัติแนะนำคือการใช้ชื่อที่ผ่านการรับรองอย่างสมบูรณ์สำหรับผู้ให้บริการเนื้อหา เช่น ชื่อแพ็กเกจตามด้วยชื่อคลาสของผู้ให้บริการ เช่น "com.example.MySuggestionProvider"

โหมดฐานข้อมูลต้องมี DATABASE_MODE_QUERIES และอาจมี DATABASE_MODE_2LINES ซึ่งจะเพิ่มคอลัมน์ลงในตารางคำแนะนำเพื่อให้คุณระบุข้อความบรรทัดที่ 2 พร้อมคำแนะนำแต่ละรายการได้ หากต้องการแสดงคำแนะนำ 2 บรรทัดในแต่ละรายการ ให้ดูตัวอย่างต่อไปนี้

Kotlin

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

Java

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

ประกาศผู้ให้บริการเนื้อหาในไฟล์ Manifest ของแอปพลิเคชันด้วยสตริงสิทธิ์เดียวกันกับที่ใช้ในคลาส SearchRecentSuggestionsProvider และในการกำหนดค่าที่ค้นหาได้ เช่น

<application>
    <provider android:name=".MySuggestionProvider"
              android:authorities="com.example.MySuggestionProvider" />
    ...
</application>

แก้ไขการกำหนดค่าที่ค้นหาได้

หากต้องการกำหนดค่าระบบให้ใช้ผู้ให้บริการคำแนะนำ ให้เพิ่มแอตทริบิวต์ android:searchSuggestAuthority และ android:searchSuggestSelection ลงในองค์ประกอบ <searchable> ในไฟล์การกำหนดค่าที่ค้นหาได้ เช่น

<?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"
    android:searchSuggestAuthority="com.example.MySuggestionProvider"
    android:searchSuggestSelection=" ?" >
</searchable>

ค่าของ android:searchSuggestAuthority ต้องเป็นชื่อที่สมบูรณ์ในตัวเองสำหรับผู้ให้บริการเนื้อหาที่ตรงกับสิทธิ์ที่ใช้ในผู้ให้บริการเนื้อหาทุกประการ เช่น "com.example.MySuggestionProvider" ในตัวอย่างก่อนหน้า

ค่าของ android:searchSuggestSelection ต้องเป็นเครื่องหมายคำถามเดี่ยวที่นำหน้าด้วยช่องว่าง " ?" ซึ่งเป็นตัวยึดตำแหน่งสำหรับอาร์กิวเมนต์การเลือก SQLite และระบบจะแทนที่ด้วยข้อความคำค้นหาที่ผู้ใช้ป้อนโดยอัตโนมัติ

บันทึกคำค้นหา

หากต้องการป้อนข้อมูลลงในคอลเล็กชันคำค้นหาล่าสุด ให้เพิ่มคำค้นหาแต่ละรายการที่กิจกรรมที่ค้นหาได้ได้รับไปยัง SearchRecentSuggestionsProvider โดยสร้างอินสแตนซ์ของ SearchRecentSuggestions และเรียก saveRecentQuery() ทุกครั้งที่กิจกรรมที่ค้นหาได้ได้รับคำค้นหา ตัวอย่างเช่น วิธีบันทึกคำค้นหาระหว่างเมธอด onCreate() ของกิจกรรม

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            SearchRecentSuggestions(this, MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE)
                    .saveRecentQuery(query, null)
        }
    }
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent  = getIntent();

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE);
        suggestions.saveRecentQuery(query, null);
    }
}

เครื่องมือสร้าง SearchRecentSuggestionsProvider ต้องใช้สิทธิ์และโหมดฐานข้อมูลเดียวกันกับที่ผู้ให้บริการเนื้อหาประกาศ

เมธอด saveRecentQuery() จะใช้สตริงคำค้นหาเป็นพารามิเตอร์แรก และใช้สตริงที่ 2 เป็นบรรทัดที่ 2 ของคำแนะนำหรือใช้ค่า Null เป็นพารามิเตอร์ที่ 2 (ไม่บังคับ) ระบบจะใช้พารามิเตอร์ที่ 2 ก็ต่อเมื่อคุณเปิดใช้โหมด 2 บรรทัดสำหรับคำแนะนำการค้นหาด้วย DATABASE_MODE_2LINES หากเปิดใช้โหมด 2 บรรทัด ระบบจะจับคู่ข้อความคำค้นหากับบรรทัดที่ 2 เมื่อระบบมองหาคำแนะนำที่ตรงกัน

ล้างข้อมูลคำแนะนำ

โปรดระบุวิธีให้ผู้ใช้ล้างคำแนะนำคำค้นหาล่าสุดเสมอเพื่อปกป้องความเป็นส่วนตัวของผู้ใช้ หากต้องการล้างประวัติคำค้นหา ให้เรียก clearHistory() เช่น

Kotlin

SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE)
        .clearHistory()

Java

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
        HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();

เรียกใช้ฟังก์ชันนี้จากรายการเมนู รายการการตั้งค่า หรือปุ่ม "ล้างประวัติการค้นหา" ที่คุณเลือก แสดงกล่องโต้ตอบการยืนยันเพื่อตรวจสอบว่าผู้ใช้ต้องการลบประวัติการค้นหา