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

รูปที่ 1 ภาพหน้าจอของกล่องโต้ตอบการค้นหาพร้อมคำแนะนำการค้นหาล่าสุด
คำแนะนำคำค้นหาล่าสุดคือการค้นหาที่บันทึกไว้ เมื่อผู้ใช้เลือกคำแนะนำ กิจกรรมที่ค้นหาได้จะได้รับACTION_SEARCH
เจตนา
พร้อมคำแนะนำเป็นคำค้นหาที่กิจกรรมที่ค้นหาได้จัดการอยู่แล้ว
หากต้องการแสดงคำแนะนำคำค้นหาล่าสุด คุณต้องทำดังนี้
- ใช้กิจกรรมที่ค้นหาได้
- สร้างผู้ให้บริการเนื้อหาที่ขยาย
SearchRecentSuggestionsProvider
และประกาศในไฟล์ Manifest ของแอปพลิเคชัน - แก้ไขการกำหนดค่าที่ค้นหาได้ด้วยข้อมูลเกี่ยวกับผู้ให้บริการเนื้อหาที่ให้ คำแนะนำในการค้นหา
- บันทึกการค้นหาไปยังผู้ให้บริการเนื้อหาทุกครั้งที่มีการค้นหา
ระบบ Android จะแสดงกล่องโต้ตอบการค้นหาเช่นเดียวกับการแสดงคำแนะนำการค้นหาด้านล่างกล่องโต้ตอบหรือวิดเจ็ตค้นหา คุณระบุแหล่งที่มาที่ระบบดึงคำแนะนำจาก
เมื่อระบบระบุว่ากิจกรรมของคุณค้นหาได้และแสดงคำแนะนำในการค้นหา จะเกิดสิ่งต่อไปนี้เมื่อผู้ใช้พิมพ์คำค้นหา
- ระบบจะใช้ข้อความคำค้นหา ไม่ว่าผู้ใช้จะเริ่มพิมพ์อะไรก็ตาม และ ทำการค้นหาไปยังผู้ให้บริการเนื้อหาที่มีคำแนะนำของคุณ
- ผู้ให้บริการเนื้อหาจะส่งคืน
Cursor
ที่ชี้ไปยังคำแนะนำทั้งหมด ที่ตรงกับข้อความค้นหา - ระบบจะแสดงรายการคำแนะนำที่
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();
ดำเนินการนี้จากรายการเมนู "ล้างประวัติการค้นหา" รายการค่ากำหนด หรือปุ่มที่คุณเลือก แสดงกล่องโต้ตอบการยืนยันเพื่อยืนยันว่าผู้ใช้ต้องการลบประวัติการค้นหา