คุณให้คำแนะนำการค้นหาตามคำค้นหาล่าสุดได้ในกล่องโต้ตอบการค้นหาของ Android หรือ วิดเจ็ต Search ตัวอย่างเช่น หากผู้ใช้ค้นหาคำว่า "ลูกสุนัข" ข้อความค้นหาจะปรากฏเป็นคำแนะนำเมื่อ พิมพ์ข้อความค้นหาเดิมอีกครั้ง รูปที่ 1 แสดงตัวอย่างกล่องโต้ตอบการค้นหาที่มีการค้นหาล่าสุด แนะนำ
ก่อนเริ่มต้น ให้ใช้กล่องโต้ตอบการค้นหาหรือวิดเจ็ต Search สําหรับการค้นหาพื้นฐาน ในแอปพลิเคชันของคุณ ดูวิธีการได้ที่ สร้างอินเทอร์เฟซการค้นหา
ข้อมูลเบื้องต้น
![](https://developer.android.com/static/images/search/search-suggest-recent-queries.png?authuser=7&hl=th)
รูปที่ 1 ภาพหน้าจอของกล่องโต้ตอบการค้นหาพร้อมการค้นหาล่าสุด แนะนำ
การแนะนำคำค้นหาล่าสุดคือการค้นหาที่บันทึกไว้ เมื่อผู้ใช้เลือกคำแนะนำ ฟิลด์ที่ค้นหาได้
กิจกรรมได้รับ
Intent ACTION_SEARCH
รายการ
พร้อมคำค้นหาเป็นคำค้นหาที่กิจกรรมที่ค้นหาได้ของคุณรองรับอยู่แล้ว
หากต้องการให้คำแนะนำการค้นหาล่าสุด คุณต้องทำดังนี้
- นำกิจกรรมที่ค้นหาได้มาใช้
- สร้างผู้ให้บริการเนื้อหาที่ขยายขอบเขต
SearchRecentSuggestionsProvider
และประกาศไว้ในไฟล์ Manifest ของแอปพลิเคชัน - แก้ไขการกำหนดค่าที่ค้นหาได้ซึ่งมีข้อมูลเกี่ยวกับผู้ให้บริการเนื้อหาที่ให้ การแนะนำการค้นหา
- บันทึกคำค้นหาไปยังผู้ให้บริการเนื้อหาทุกครั้งที่ดำเนินการค้นหา
ระบบ Android จะแสดงกล่องโต้ตอบการค้นหา แสดงการแนะนำการค้นหาด้านล่าง เช่นเดียวกับที่ระบบ 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 ที่จะรวมเป็นบรรทัดที่สองของคำแนะนำหรือ 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();
ดำเนินการจากตัวเลือก "ล้างประวัติการค้นหา" ที่คุณต้องการ รายการเมนู รายการค่ากำหนด หรือปุ่ม ระบุกล่องโต้ตอบการยืนยันเพื่อยืนยันว่าผู้ใช้ต้องการลบประวัติการค้นหาของตน