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