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

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

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

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

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

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

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

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

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

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

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

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

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

  • หากผู้ใช้พิมพ์คีย์อื่นหรือเปลี่ยนคำค้นหาไม่ว่าในลักษณะใด ระบบจะทำขั้นตอนก่อนหน้าซ้ำและอัปเดตรายการคำแนะนำ
  • หากผู้ใช้ทำการค้นหา ระบบจะละเว้นคำแนะนำและส่งการค้นหาไปยัง กิจกรรมที่ค้นหาได้โดยใช้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;

ประกาศ Content Provider ในไฟล์ 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 บรรทัดสําหรับคําแนะนําการค้นหาด้วย 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();

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