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

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

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

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

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

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

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

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

ระบบ Android จะแสดงกล่องโต้ตอบการค้นหา แสดงการแนะนำการค้นหาด้านล่าง เช่นเดียวกับที่ระบบ 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 ที่จะรวมเป็นบรรทัดที่สองของคำแนะนำหรือ Null องค์ประกอบที่ 2 จะใช้เฉพาะเมื่อคุณเปิดใช้งานโหมดสองบรรทัดสำหรับคำแนะนำการค้นหาด้วย DATABASE_MODE_2LINES หากคุณเปิดใช้โหมดสองบรรทัด ข้อความค้นหาจะตรงกับ บรรทัดที่ 2 หากระบบมองหาคำแนะนำที่ตรงกัน

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

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

Kotlin

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

Java

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

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