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

คุณให้คำแนะนำการค้นหาตามคำค้นหาล่าสุดได้ในกล่องโต้ตอบการค้นหาของ 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();

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