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

รูปที่ 1 ภาพหน้าจอของกล่องโต้ตอบการค้นหาที่มี คำแนะนำการค้นหาที่กำหนดเอง
เมื่อผู้ใช้เลือกคำแนะนำที่กำหนดเอง ระบบจะส่ง Intent
ไปยังกิจกรรมที่ค้นหาได้ของคุณ
ไม่เหมือนกับคำค้นหาปกติที่ส่งเจตนาพร้อมกับ
ACTION_SEARCH
การดำเนินการ คุณสามารถกำหนดคำแนะนำที่กำหนดเองเพื่อใช้
ACTION_VIEW
หรือ
การดำเนินการเจตนาอื่นๆ แทนได้ และยังรวมข้อมูลที่เกี่ยวข้องกับ
คำแนะนำที่เลือกไว้ได้ด้วย ในตัวอย่างพจนานุกรม เมื่อผู้ใช้เลือกคำแนะนำ แอปจะเปิดคำจำกัดความของคำนั้นได้ทันที แทนที่จะค้นหาคำที่ตรงกันในพจนานุกรม
หากต้องการให้คำแนะนำที่กำหนดเอง ให้ทำตามขั้นตอนต่อไปนี้
- ใช้กิจกรรมที่ค้นหาได้ขั้นพื้นฐานตามที่อธิบายไว้ใน สร้างอินเทอร์เฟซการค้นหา
- แก้ไขการกำหนดค่าที่ค้นหาได้ด้วยข้อมูลเกี่ยวกับผู้ให้บริการเนื้อหาที่ให้คำแนะนำที่กำหนดเอง
- สร้างตาราง เช่น ใน
SQLiteDatabase
สำหรับคำแนะนำของคุณ แล้วจัดรูปแบบตารางด้วยคอลัมน์ที่จำเป็น - สร้างผู้ให้บริการ เนื้อหาที่มีสิทธิ์เข้าถึงตารางคำแนะนำของคุณและประกาศ ผู้ให้บริการในไฟล์ Manifest
- ประกาศประเภทของ
Intent
ที่จะส่งเมื่อผู้ใช้เลือกคำแนะนำ รวมถึงการดำเนินการที่กำหนดเองและข้อมูลที่กำหนดเอง
ระบบ Android จะแสดงกล่องโต้ตอบการค้นหาและ คำแนะนำในการค้นหา คุณต้องมีผู้ให้บริการเนื้อหาที่ระบบสามารถ ดึงคำแนะนำของคุณได้ อ่านส่วนผู้ให้บริการเนื้อหา เพื่อดูวิธีสร้างผู้ให้บริการเนื้อหา
เมื่อระบบระบุว่ากิจกรรมของคุณค้นหาได้และแสดงคำแนะนำในการค้นหา กระบวนการต่อไปนี้จะเกิดขึ้นเมื่อผู้ใช้ป้อนคำค้นหา
- ระบบจะนำข้อความคำค้นหา ซึ่งหมายถึงข้อความที่ป้อน จนถึงตอนนี้ ไปทำการค้นหาในผู้ให้บริการเนื้อหาที่จัดการ คำแนะนำของคุณ
- ผู้ให้บริการเนื้อหาจะแสดง
Cursor
ซึ่งชี้ไปยังคำแนะนำทั้งหมดที่เกี่ยวข้องกับข้อความค้นหา - ระบบจะแสดงรายการคำแนะนำที่
Cursor
ให้ไว้
เมื่อคำแนะนำที่กำหนดเองแสดงขึ้น อาจเกิดสิ่งต่อไปนี้
- หากผู้ใช้ป้อนตัวอักษรอื่นหรือเปลี่ยนคำค้นหาไม่ว่าในลักษณะใด ขั้นตอนก่อนหน้าจะทำซ้ำและรายการคำแนะนำจะอัปเดตตามนั้น
- หากผู้ใช้ดำเนินการค้นหา ระบบจะละเว้นคำแนะนำและส่งการค้นหาไปยังกิจกรรมที่ค้นหาได้โดยใช้
ACTION_SEARCH
Intent ปกติ - หากผู้ใช้เลือกคำแนะนำ ระบบจะส่ง Intent ไปยังกิจกรรมที่ค้นหาได้ พร้อมกับการดำเนินการและข้อมูลที่กำหนดเองเพื่อให้แอปเปิดเนื้อหาที่แนะนำได้
แก้ไขการกำหนดค่าที่ค้นหาได้
หากต้องการเพิ่มการรองรับคำแนะนำที่กำหนดเอง ให้เพิ่มแอตทริบิวต์
android:searchSuggestAuthority
ลงในองค์ประกอบ
<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.MyCustomSuggestionProvider"> </searchable>
คุณอาจต้องใช้แอตทริบิวต์เพิ่มเติม ทั้งนี้ขึ้นอยู่กับประเภทความตั้งใจที่คุณ แนบไปกับคำแนะนำแต่ละรายการ และวิธีที่ต้องการจัดรูปแบบคำค้นหาไปยังผู้ให้บริการเนื้อหา แอตทริบิวต์อื่นๆ ที่ไม่บังคับจะกล่าวถึงในส่วนต่อไปนี้
สร้างผู้ให้บริการเนื้อหา
หากต้องการสร้างผู้ให้บริการเนื้อหาสำหรับคำแนะนำที่กำหนดเอง โปรดดูผู้ให้บริการเนื้อหา
เพื่อดูวิธีสร้างผู้ให้บริการเนื้อหาก่อน ผู้ให้บริการเนื้อหาสำหรับคำแนะนำที่กำหนดเองจะคล้ายกับผู้ให้บริการเนื้อหารายอื่นๆ อย่างไรก็ตาม สำหรับคำแนะนำแต่ละรายการที่คุณระบุ แถวที่เกี่ยวข้องใน Cursor
ต้องมีคอลัมน์ที่เฉพาะเจาะจงซึ่งระบบเข้าใจและใช้เพื่อจัดรูปแบบคำแนะนำ
เมื่อผู้ใช้ป้อนข้อความในกล่องโต้ตอบการค้นหาหรือวิดเจ็ตการค้นหา ระบบจะ
ส่งคำค้นหาไปยังผู้ให้บริการเนื้อหาเพื่อรับคำแนะนำโดยการเรียกใช้
query()
ทุกครั้งที่มีการป้อนตัวอักษร ในการติดตั้งใช้งาน query()
ผู้ให้บริการเนื้อหาต้องค้นหาข้อมูลคำแนะนำและส่งคืน
Cursor
ที่ชี้ไปยังแถวที่ระบบพิจารณาว่าเป็นคำแนะนำที่ดี
รายละเอียดเกี่ยวกับการสร้างผู้ให้บริการเนื้อหาสำหรับคำแนะนำที่กำหนดเองจะ กล่าวถึงใน 2 ส่วนต่อไปนี้
- จัดการการค้นหาคำแนะนำ
- วิธีที่ระบบส่งคำขอไปยังผู้ให้บริการเนื้อหาและวิธีจัดการคำขอ เหล่านั้น
- สร้างตารางคำแนะนำ
- วิธีระบุคอลัมน์ที่ระบบคาดหวังใน
Cursor
ที่แสดงผลพร้อมกับแต่ละคำค้นหา
จัดการคำค้นหาที่แนะนำ
เมื่อระบบขอคำแนะนำจากผู้ให้บริการเนื้อหา ระบบจะเรียกใช้เมธอด query()
ของผู้ให้บริการเนื้อหา ใช้วิธีนี้เพื่อค้นหาข้อมูลคำแนะนำและแสดง Cursor
ที่ชี้ไปยังคำแนะนำที่คุณเห็นว่าเกี่ยวข้อง
ต่อไปนี้คือสรุปพารามิเตอร์ที่ระบบส่งไปยังเมธอด query()
ของคุณ โดยเรียงตามลำดับ
uri
เนื้อหาเสมอ
Uri
ซึ่งจัดรูปแบบดังนี้content://your.authority/optional.suggest.path/
SUGGEST_URI_PATH_QUERY
ลักษณะการทำงานเริ่มต้นคือระบบจะส่ง URI นี้และต่อท้ายข้อความค้นหา
content://your.authority/optional.suggest.path/
SUGGEST_URI_PATH_QUERY
/puppiesข้อความค้นหาที่ส่วนท้ายจะได้รับการเข้ารหัสโดยใช้กฎการเข้ารหัส URI ดังนั้นคุณอาจต้อง ถอดรหัสก่อนทำการค้นหา
ส่วน
optional.suggest.path
จะรวมอยู่ใน URI ก็ต่อเมื่อคุณตั้งค่าเส้นทางดังกล่าวในไฟล์การกำหนดค่าที่ค้นหาได้ด้วย แอตทริบิวต์android:searchSuggestPath
จำเป็นเฉพาะในกรณีที่คุณใช้ผู้ให้บริการเนื้อหารายเดียวกันสำหรับกิจกรรมที่ค้นหาได้หลายรายการ หาก เป็นเช่นนี้ ให้ระบุแหล่งที่มาของคำค้นหาที่แนะนำprojection
- ไม่มีค่าเสมอ
selection
- ค่าที่ระบุในแอตทริบิวต์
android:searchSuggestSelection
ของไฟล์การกำหนดค่าที่ค้นหาได้ หรือ null หากคุณไม่ได้ ประกาศแอตทริบิวต์android:searchSuggestSelection
ส่วนต่อไปนี้จะอธิบายเรื่องนี้เพิ่มเติมselectionArgs
- มีคำค้นหาเป็นองค์ประกอบแรกและองค์ประกอบเดียวของอาร์เรย์ หากคุณประกาศแอตทริบิวต์
android:searchSuggestSelection
ใน การกำหนดค่าที่ค้นหาได้ หากไม่ได้ประกาศandroid:searchSuggestSelection
พารามิเตอร์นี้จะเป็นค่าว่าง ส่วนต่อไปนี้จะอธิบายเรื่องนี้เพิ่มเติมsortOrder
- ไม่มีค่าเสมอ
ระบบจะส่งข้อความคำค้นหาให้คุณได้ 2 วิธี วิธีเริ่มต้นคือการรวมข้อความค้นหาเป็นเส้นทางสุดท้ายของ URI เนื้อหาที่ส่งในพารามิเตอร์ uri
อย่างไรก็ตาม หากคุณรวมค่าการเลือกไว้ในandroid:searchSuggestSelection
แอตทริบิวต์ของการกำหนดค่าที่ค้นหาได้ ข้อความค้นหาจะส่งผ่านเป็นองค์ประกอบแรกของอาร์เรย์สตริง selectionArgs
แทน โดยจะอธิบายตัวเลือกทั้ง 2 นี้
ต่อไป
รับคำค้นหาใน Uri
โดยค่าเริ่มต้น ระบบจะต่อท้ายการค้นหาเป็นกลุ่มสุดท้ายของพารามิเตอร์ uri
ซึ่งเป็นออบเจ็กต์ Uri
หากต้องการดึงข้อความค้นหาในกรณีนี้ ให้ใช้ getLastPathSegment()
ดังที่แสดงในตัวอย่างต่อไปนี้
Kotlin
val query: String = uri.lastPathSegment.toLowerCase()
Java
String query = uri.getLastPathSegment().toLowerCase();
ซึ่งจะแสดงผลกลุ่มสุดท้ายของ Uri
ซึ่งเป็นข้อความค้นหาที่ผู้ใช้ป้อน
รับการค้นหาในอาร์กิวเมนต์การเลือก
แทนที่จะใช้ URI คุณอาจต้องการให้query()
เมธอดรับทุกอย่างที่จำเป็นต่อการค้นหา และอาจต้องการให้พารามิเตอร์ selection
และselectionArgs
มีค่าที่เหมาะสม ในกรณีนี้ ให้เพิ่มแอตทริบิวต์ android:searchSuggestSelection
ลงในการกำหนดค่าที่ค้นหาได้พร้อมสตริงการเลือก SQLite ในสตริงการเลือก
ให้ใส่เครื่องหมายคำถาม (?) เป็นตัวยึดตำแหน่งสำหรับ
คำค้นหาจริง ระบบจะเรียกใช้ query()
โดยมีสตริงการเลือกเป็นพารามิเตอร์ selection
และคำค้นหาเป็นองค์ประกอบแรกในอาร์เรย์ selectionArgs
ตัวอย่างเช่น คุณอาจสร้างแอตทริบิวต์
android:searchSuggestSelection
เพื่อสร้างคำสั่งค้นหาแบบเต็มข้อความได้ดังนี้
<?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.MyCustomSuggestionProvider" android:searchSuggestIntentAction="android.intent.action.VIEW" android:searchSuggestSelection="word MATCH ?"> </searchable>
การกำหนดค่านี้ทำให้เมธอด query()
ส่งพารามิเตอร์
selection
เป็น "word MATCH ?"
และพารามิเตอร์
selectionArgs
เป็นคำค้นหา เมื่อส่งค่าเหล่านี้ไปยังเมธอดของ SQLite query()
เป็นอาร์กิวเมนต์ที่เกี่ยวข้อง ระบบจะสังเคราะห์ค่าเหล่านี้เข้าด้วยกัน ซึ่งหมายความว่าเครื่องหมายคำถามจะถูกแทนที่ด้วยข้อความการค้นหา หากคุณได้รับคำค้นหาที่แนะนำด้วยวิธีนี้และต้องการเพิ่มอักขระไวด์การ์ดลงในข้อความคำค้นหา ให้ต่อท้ายหรือนำหน้าพารามิเตอร์ selectionArgs
เนื่องจากค่านี้จะอยู่ในเครื่องหมายคำพูดและแทรกแทนเครื่องหมายคำถาม
อีกแอตทริบิวต์หนึ่งในตัวอย่างก่อนหน้าคือ
android:searchSuggestIntentAction
ซึ่งกําหนดการกระทําตามความตั้งใจ
ที่ส่งพร้อมกับความตั้งใจแต่ละอย่างเมื่อผู้ใช้เลือกคําแนะนํา ซึ่งจะกล่าวถึง
เพิ่มเติมในส่วนประกาศความตั้งใจสำหรับ
คำแนะนำ
สร้างตารางคำแนะนำ
เมื่อคุณส่งคำแนะนำกลับไปยังระบบด้วย Cursor
ระบบจะคาดหวังคอลัมน์ที่เฉพาะเจาะจงในแต่ละแถว ไม่ว่าคุณจะจัดเก็บข้อมูลคำแนะนำในฐานข้อมูล SQLite บนอุปกรณ์ ฐานข้อมูลบนเว็บเซิร์ฟเวอร์ หรือรูปแบบอื่นบนอุปกรณ์หรือเว็บ ให้จัดรูปแบบคำแนะนำเป็นแถวในตารางและแสดงด้วย Cursor
ระบบเข้าใจคอลัมน์หลายรายการ แต่ต้องมีเพียง 2 รายการเท่านั้น ได้แก่
_ID
- รหัสแถวจำนวนเต็มที่ไม่ซ้ำกันสำหรับคำแนะนำแต่ละรายการ ระบบต้องการข้อมูลนี้เพื่อ
แสดงคำแนะนำใน
ListView
SUGGEST_COLUMN_TEXT_1
- สตริงที่แสดงเป็นคำแนะนำ
คอลัมน์ต่อไปนี้ทั้งหมดจะใช้หรือไม่ก็ได้ เราจะอธิบายรายละเอียดเพิ่มเติมของแต่ละตัวเลือกในส่วนต่อไปนี้
SUGGEST_COLUMN_TEXT_2
- สตริง หาก
Cursor
มีคอลัมน์นี้ ระบบจะแสดงคำแนะนำทั้งหมดในรูปแบบ 2 บรรทัด สตริงในคอลัมน์นี้จะ แสดงเป็นบรรทัดข้อความที่ 2 ซึ่งมีขนาดเล็กกว่าข้อความ คำแนะนำหลัก อาจเป็น Null หรือว่างเปล่าเพื่อระบุว่าไม่มีข้อความรอง SUGGEST_COLUMN_ICON_1
- สตริง URI ของทรัพยากรที่วาดได้ เนื้อหา หรือไฟล์ หาก
Cursor
มีคอลัมน์นี้ ระบบจะแสดงคำแนะนำทั้งหมด ในรูปแบบไอคอนบวกข้อความพร้อมไอคอนที่วาดได้ทางด้านซ้าย ซึ่งอาจเป็นค่า Null หรือ 0 เพื่อระบุว่าไม่มีไอคอนในแถวนี้ SUGGEST_COLUMN_ICON_2
- สตริง URI ของทรัพยากรที่วาดได้ เนื้อหา หรือไฟล์ หาก
Cursor
มีคอลัมน์นี้ ระบบจะแสดงคำแนะนำทั้งหมด ในรูปแบบไอคอนบวกข้อความโดยมีไอคอนอยู่ทางด้านขวา ซึ่งอาจเป็น null หรือ 0 เพื่อระบุว่าไม่มีไอคอนในแถวนี้ SUGGEST_COLUMN_INTENT_ACTION
- สตริงการดำเนินการผ่าน Intent หากคอลัมน์นี้มีอยู่และมีค่าในแถวที่ระบุ ระบบจะใช้การกระทําที่กําหนดไว้ที่นี่เมื่อสร้างเจตนาของคําแนะนํา หากไม่ได้ระบุองค์ประกอบ ระบบจะดำเนินการจากฟิลด์
android:searchSuggestIntentAction
ในการกำหนดค่าที่ค้นหาได้ หากการดำเนินการของคุณเหมือนกันสำหรับคำแนะนำทั้งหมด การระบุการดำเนินการโดยใช้android:searchSuggestIntentAction
จะมีประสิทธิภาพมากกว่าและไม่ต้องระบุคอลัมน์นี้ SUGGEST_COLUMN_INTENT_DATA
- สตริง URI ข้อมูล หากคอลัมน์นี้มีอยู่และมีค่าในแถวที่ระบุ ระบบจะใช้ข้อมูลนี้เมื่อสร้างเจตนาของคำแนะนำ หากไม่ได้ระบุองค์ประกอบ
ระบบจะดึงข้อมูลจากฟิลด์
android:searchSuggestIntentData
ในการกำหนดค่าที่ค้นหาได้ หากไม่ได้ระบุแหล่งที่มาทั้ง 2 แหล่ง ฟิลด์ข้อมูลของ Intent จะเป็น null หากข้อมูลของคุณเหมือนกันสำหรับคำแนะนำทั้งหมด หรืออธิบายได้โดยใช้ส่วนคงที่และรหัสที่เฉพาะเจาะจง การระบุโดยใช้android:searchSuggestIntentData
จะมีประสิทธิภาพมากกว่า และคุณไม่จำเป็นต้องระบุคอลัมน์นี้ SUGGEST_COLUMN_INTENT_DATA_ID
- สตริงเส้นทาง URI หากคอลัมน์นี้มีอยู่และมีค่าในแถวที่กำหนด ระบบจะต่อท้าย "/" และค่านี้เข้ากับฟิลด์ข้อมูลใน Intent
ใช้เฉพาะในกรณีที่ฟิลด์ข้อมูลที่ระบุโดยแอตทริบิวต์
android:searchSuggestIntentData
ในการกำหนดค่าที่ค้นหาได้ตั้งค่าเป็นสตริงฐานที่เหมาะสมอยู่แล้ว SUGGEST_COLUMN_INTENT_EXTRA_DATA
- ข้อมูลที่กำหนดเอง หากคอลัมน์นี้มีอยู่และมีค่าในแถวที่กำหนด
นี่คือข้อมูลพิเศษที่ใช้เมื่อสร้างเจตนาของคำแนะนำ
หากไม่ได้ระบุ ระบบจะตั้งค่าช่องข้อมูลพิเศษของ Intent เป็น Null คอลัมน์นี้ช่วยให้
คำแนะนำมีข้อมูลเพิ่มเติมซึ่งรวมอยู่ใน
EXTRA_DATA_KEY
คีย์ของ Intent SUGGEST_COLUMN_QUERY
- หากมีคอลัมน์นี้และมีองค์ประกอบนี้ในแถวที่ระบุ นี่คือข้อมูลที่ใช้เมื่อสร้างคำค้นหาของคำแนะนำ ซึ่งรวมเป็นข้อมูลพิเศษในคีย์ของเจตนา
QUERY
ต้องระบุหากการดำเนินการของคำแนะนำคือACTION_SEARCH
แต่ไม่บังคับในกรณีอื่นๆ SUGGEST_COLUMN_SHORTCUT_ID
- ใช้เมื่อให้คำแนะนำสำหรับช่องค้นหาด่วนเท่านั้น คอลัมน์นี้
ระบุว่าต้องจัดเก็บคำแนะนำในการค้นหาเป็นทางลัดหรือไม่ และ
ต้องตรวจสอบหรือไม่ โดยปกติแล้ว ระบบจะสร้างทางลัดเมื่อผู้ใช้แตะคำแนะนำจากช่องค้นหาด่วน
หากไม่มี ระบบจะจัดเก็บผลลัพธ์เป็น
ทางลัดและจะไม่รีเฟรช หากตั้งค่าเป็น
SUGGEST_NEVER_MAKE_SHORTCUT
ระบบจะไม่จัดเก็บผลลัพธ์เป็นทางลัด ไม่เช่นนั้น ระบบจะใช้รหัสทางลัดเพื่อ ตรวจสอบคำแนะนำล่าสุดโดยใช้SUGGEST_URI_PATH_SHORTCUT
SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING
- ใช้เมื่อให้คำแนะนำสำหรับช่องค้นหาด่วนเท่านั้น คอลัมน์นี้
ระบุว่าต้องแสดงวงกลมหมุนแทนไอคอนจาก
SUGGEST_COLUMN_ICON_2
ขณะที่แป้นพิมพ์ลัดของคำแนะนำนี้ กำลังรีเฟรชในช่องค้นหาด่วน
เราจะอธิบายคอลัมน์เหล่านี้ส่วนใหญ่เพิ่มเติมในส่วนต่อไปนี้
ประกาศ Intent สำหรับคำแนะนำ
เมื่อผู้ใช้เลือกคำแนะนำจากรายการที่ปรากฏใต้กล่องโต้ตอบหรือวิดเจ็ตการค้นหา ระบบจะส่ง Intent
ที่กำหนดเองไปยังกิจกรรมที่ค้นหาได้ คุณต้องกำหนดการดำเนินการและข้อมูลสำหรับ Intent
ประกาศการดำเนินการผ่าน Intent
การดำเนินการตามความตั้งใจที่พบบ่อยที่สุดสำหรับคำแนะนำที่กำหนดเองคือ
ACTION_VIEW
ซึ่งเหมาะสมเมื่อคุณต้องการเปิดบางสิ่ง
เช่น คำจำกัดความของคำ ข้อมูลติดต่อของบุคคล หรือหน้าเว็บ
อย่างไรก็ตาม การดำเนินการตามความตั้งใจอาจเป็นการดำเนินการอื่นๆ และอาจแตกต่างกันไปสำหรับแต่ละคำแนะนำ
คุณกำหนดการดำเนินการได้ 2 วิธี โดยขึ้นอยู่กับว่าต้องการให้คำแนะนำทั้งหมดใช้การดำเนินการตามความตั้งใจเดียวกันหรือไม่
- ใช้แอตทริบิวต์
android:searchSuggestIntentAction
ของ ไฟล์การกำหนดค่าที่ค้นหาได้เพื่อกำหนดการดำเนินการสำหรับคำแนะนำทั้งหมด ดังที่ แสดงในตัวอย่างต่อไปนี้<?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.MyCustomSuggestionProvider" android:searchSuggestIntentAction="android.intent.action.VIEW" > </searchable>
- ใช้คอลัมน์
SUGGEST_COLUMN_INTENT_ACTION
เพื่อกำหนดการดำเนินการ สำหรับคำแนะนำแต่ละรายการ โดยให้เพิ่มคอลัมน์SUGGEST_COLUMN_INTENT_ACTION
ลงในตารางคำแนะนำ และสำหรับคำแนะนำแต่ละรายการ ให้ใส่การดำเนินการที่จะใช้ เช่น"android.intent.action.VIEW"
คุณยังใช้เทคนิคทั้ง 2 อย่างนี้ร่วมกันได้ด้วย เช่น คุณสามารถใส่แอตทริบิวต์
android:searchSuggestIntentAction
พร้อมการดำเนินการที่จะ
ใช้กับคำแนะนำทั้งหมดโดยค่าเริ่มต้น จากนั้นลบล้างการดำเนินการนี้สำหรับคำแนะนำบางรายการ
โดยประกาศการดำเนินการอื่นในคอลัมน์
SUGGEST_COLUMN_INTENT_ACTION
หากคุณไม่ได้ระบุค่า
ในคอลัมน์ SUGGEST_COLUMN_INTENT_ACTION
ระบบจะใช้เจตนา
ที่ระบุในแอตทริบิวต์ android:searchSuggestIntentAction
ประกาศข้อมูลความตั้งใจ
เมื่อผู้ใช้เลือกคำแนะนำ กิจกรรมที่ค้นหาได้จะได้รับ
Intent พร้อมการดำเนินการที่คุณกำหนดไว้ ดังที่ได้กล่าวไว้ในส่วนก่อนหน้า
แต่ Intent ต้องมีข้อมูลเพื่อให้กิจกรรมระบุได้ด้วยว่า
มีการเลือกคำแนะนำใด กล่าวคือ ข้อมูลต้องเป็นข้อมูลที่ไม่ซ้ำกัน
สำหรับคำแนะนำแต่ละรายการ เช่น รหัสแถวของคำแนะนำในตาราง SQLite
เมื่อได้รับ Intent คุณจะเรียกข้อมูลที่แนบมาได้ด้วย
getData()
หรือ
getDataString()
คุณกำหนดข้อมูลที่รวมไว้กับ Intent ได้ 2 วิธี ดังนี้
- กำหนดข้อมูลสำหรับคำแนะนำแต่ละรายการภายใน
SUGGEST_COLUMN_INTENT_DATA
คอลัมน์ของตารางคำแนะนำระบุข้อมูลที่จำเป็นทั้งหมดสำหรับแต่ละเจตนาในตารางคำแนะนำ โดยใส่คอลัมน์
SUGGEST_COLUMN_INTENT_DATA
และ จากนั้นป้อนข้อมูลที่ไม่ซ้ำกันสำหรับแต่ละแถว ระบบจะแนบข้อมูลจากคอลัมน์นี้ เข้ากับเจตนาตรงตามที่คุณกำหนดไว้ในคอลัมน์นี้ จากนั้นคุณจะดึงข้อมูลด้วยgetData()
หรือgetDataString()
ได้ - แยก URI ข้อมูลออกเป็น 2 ส่วน ได้แก่ ส่วนที่ใช้ร่วมกันในคำแนะนำทั้งหมด
และส่วนที่ไม่ซ้ำกันในคำแนะนำแต่ละรายการ วางชิ้นส่วนเหล่านี้ลงใน
android:searchSuggestintentData
แอตทริบิวต์ของการกำหนดค่าที่ค้นหาได้ และคอลัมน์SUGGEST_COLUMN_INTENT_DATA_ID
ของ ตารางคำแนะนำตามลำดับตัวอย่างต่อไปนี้แสดงวิธีประกาศส่วนของ URI ที่ ใช้ร่วมกันในคำแนะนำทั้งหมดในแอตทริบิวต์
android:searchSuggestIntentData
ของการกำหนดค่าที่ค้นหาได้<?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.MyCustomSuggestionProvider" android:searchSuggestIntentAction="android.intent.action.VIEW" android:searchSuggestIntentData="content://com.example/datatable" > </searchable>
ระบุเส้นทางสุดท้ายของคำแนะนำแต่ละรายการ ซึ่งเป็นส่วนที่ไม่ซ้ำกัน ใน คอลัมน์
SUGGEST_COLUMN_INTENT_DATA_ID
ของตารางคำแนะนำ เมื่อผู้ใช้เลือกคำแนะนำ ระบบจะนำสตริงจากandroid:searchSuggestIntentData
ต่อด้วยเครื่องหมายทับ (/) แล้วเพิ่มค่าที่เกี่ยวข้องจากคอลัมน์SUGGEST_COLUMN_INTENT_DATA_ID
เพื่อสร้าง URI ของเนื้อหาที่สมบูรณ์ จากนั้นคุณจะดึงข้อมูลUri
ด้วยgetData()
ได้
เพิ่มข้อมูล
หากต้องการแสดงข้อมูลเพิ่มเติมเกี่ยวกับความตั้งใจ คุณสามารถเพิ่มคอลัมน์ตารางอื่น เช่น SUGGEST_COLUMN_INTENT_EXTRA_DATA
ซึ่งจัดเก็บข้อมูลเพิ่มเติมเกี่ยวกับคำแนะนำได้
ระบบจะวางข้อมูลที่บันทึกไว้ในคอลัมน์นี้
ไว้ใน EXTRA_DATA_KEY
ของกลุ่มพิเศษของ Intent
จัดการความตั้งใจ
หลังจากระบุคำแนะนำการค้นหาที่กำหนดเองด้วยความตั้งใจที่กำหนดเองแล้ว คุณต้องมี
กิจกรรมที่ค้นหาได้เพื่อจัดการความตั้งใจเหล่านี้เมื่อผู้ใช้เลือกคำแนะนำ
ซึ่งนอกเหนือจากการจัดการACTION_SEARCH
เจตนา ซึ่งกิจกรรมที่ค้นหาได้ของคุณทำอยู่แล้ว ตัวอย่างวิธีจัดการ Intent ระหว่างการเรียกกลับของกิจกรรม
onCreate()
มีดังนี้
Kotlin
when(intent.action) { Intent.ACTION_SEARCH -> { // Handle the normal search query case. intent.getStringExtra(SearchManager.QUERY)?.also { query -> doSearch(query) } } Intent.ACTION_VIEW -> { // Handle a suggestions click, because the suggestions all use ACTION_VIEW. showResult(intent.data) } }
Java
Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { // Handle the normal search query case. String query = intent.getStringExtra(SearchManager.QUERY); doSearch(query); } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { // Handle a suggestions click, because the suggestions all use ACTION_VIEW. Uri data = intent.getData(); showResult(data); }
ในตัวอย่างนี้ การดำเนินการตามความตั้งใจคือ ACTION_VIEW
และข้อมูล
มี URI ที่สมบูรณ์ซึ่งชี้ไปยังสินค้าที่แนะนำตามที่สังเคราะห์โดยสตริง android:searchSuggestIntentData
และคอลัมน์ SUGGEST_COLUMN_INTENT_DATA_ID
จากนั้น URI จะส่งไปยังเมธอด showResult()
ที่ค้นหาผู้ให้บริการเนื้อหาสำหรับรายการที่ระบุโดย URI
เขียนข้อความค้นหาใหม่
โดยค่าเริ่มต้น หากผู้ใช้ไปยังส่วนต่างๆ ในรายการคำแนะนำโดยใช้ การควบคุมทิศทาง เช่น แทร็กบอลหรือ D-pad ข้อความค้นหาจะไม่ อัปเดต อย่างไรก็ตาม คุณสามารถเขียนข้อความค้นหาของผู้ใช้ใหม่ชั่วคราวตามที่ปรากฏ ในกล่องข้อความด้วยคำค้นหาที่ตรงกับคำแนะนำที่โฟกัสอยู่ ซึ่งจะช่วยให้ ผู้ใช้เห็นคำค้นหาที่แนะนำ และเลือกช่องค้นหาเพื่อแก้ไข คำค้นหาก่อนที่จะส่งเป็นคำค้นหาได้
คุณเขียนข้อความค้นหาใหม่ได้ด้วยวิธีต่อไปนี้
- เพิ่มแอตทริบิวต์
android:searchMode
ลงในการกำหนดค่าที่ค้นหาได้ ด้วยค่า"queryRewriteFromText"
ในกรณีนี้ ระบบจะใช้เนื้อหาจากคอลัมน์SUGGEST_COLUMN_TEXT_1
ของคำแนะนำเพื่อเขียนข้อความค้นหาใหม่ - เพิ่มแอตทริบิวต์
android:searchMode
ลงในการกำหนดค่าที่ค้นหาได้\ ด้วยค่า"queryRewriteFromData"
ในกรณีนี้ ระบบจะใช้เนื้อหาจากคอลัมน์SUGGEST_COLUMN_INTENT_DATA
ของคำแนะนำเพื่อเขียนข้อความค้นหาใหม่ ใช้กับ URI หรือรูปแบบข้อมูลอื่นๆ ที่มีไว้เพื่อให้ผู้ใช้มองเห็นได้เท่านั้น เช่น URL ของ HTTP อย่าใช้รูปแบบ URI ภายในเพื่อเขียนคำค้นหาใหม่ในลักษณะนี้ - ระบุสตริงข้อความค้นหาที่ไม่ซ้ำกันในคอลัมน์
SUGGEST_COLUMN_QUERY
ของตารางคำแนะนำ หากคอลัมน์นี้มีอยู่และมีค่าสำหรับคำแนะนำปัจจุบัน ระบบจะใช้คอลัมน์นี้เพื่อเขียนข้อความค้นหาใหม่และลบล้างการใช้งานก่อนหน้า
แสดงการแนะนำการค้นหาในช่องค้นหาแบบรวดเร็ว
เมื่อกำหนดค่าแอปให้แสดงคำแนะนำการค้นหาที่กำหนดเองแล้ว การทำให้คำแนะนำเหล่านั้นพร้อมใช้งานในช่องค้นหาด่วนที่เข้าถึงได้ทั่วโลกก็ทำได้ง่ายๆ เพียงแค่แก้ไขการกำหนดค่าที่ค้นหาได้ให้มี android:includeInGlobalSearch
ที่มีค่าเป็น "true"
สถานการณ์เดียวที่ต้องดำเนินการเพิ่มเติมคือเมื่อผู้ให้บริการเนื้อหาของคุณต้องการสิทธิ์อ่าน ในกรณีนี้ คุณต้องเพิ่มองค์ประกอบ
<path-permission>
เพื่อให้ผู้ให้บริการให้สิทธิ์อ่าน Quick
Search Box แก่ผู้ให้บริการเนื้อหาของคุณ ดังที่แสดงในตัวอย่างต่อไปนี้
<provider android:name="MySuggestionProvider" android:authorities="com.example.MyCustomSuggestionProvider" android:readPermission="com.example.provider.READ_MY_DATA" android:writePermission="com.example.provider.WRITE_MY_DATA"> <path-permission android:pathPrefix="/search_suggest_query" android:readPermission="android.permission.GLOBAL_SEARCH" /> </provider>
ในตัวอย่างนี้ ผู้ให้บริการจำกัดสิทธิ์เข้าถึงเพื่ออ่านและเขียนเนื้อหา
องค์ประกอบ <path-permission>
จะแก้ไขข้อจำกัดโดยการให้สิทธิ์เข้าถึงแบบอ่านแก่เนื้อหาภายในคำนำหน้าเส้นทาง "/search_suggest_query"
เมื่อมีสิทธิ์ "android.permission.GLOBAL_SEARCH"
ซึ่งจะให้สิทธิ์เข้าถึงช่องค้นหาด่วนเพื่อให้สามารถค้นหาเนื้อหาจากผู้ให้บริการเนื้อหาเพื่อรับคำแนะนำได้
หากผู้ให้บริการเนื้อหาไม่ได้บังคับใช้สิทธิ์การอ่าน Quick Search Box จะอ่านโดยค่าเริ่มต้น
เปิดใช้คำแนะนำในอุปกรณ์
โดยค่าเริ่มต้น ระบบจะไม่ได้เปิดใช้แอปเพื่อให้คำแนะนำในช่องค้นหาด่วน แม้ว่าจะมีการกำหนดค่าให้ทำเช่นนั้นก็ตาม ผู้ใช้จะเลือกได้ว่าจะรวม คำแนะนำจากแอปของคุณในช่องค้นหาด่วนหรือไม่ โดยเปิดรายการที่ค้นหาได้ ซึ่งอยู่ในการตั้งค่า > ค้นหา แล้วเปิดใช้แอปของคุณเป็นรายการที่ค้นหาได้
แต่ละแอปที่พร้อมใช้งานกับช่องค้นหาด่วนจะมีรายการในหน้าการตั้งค่ารายการที่ค้นหาได้ รายการนี้ประกอบด้วยชื่อแอป
และคำอธิบายสั้นๆ เกี่ยวกับเนื้อหาที่ค้นหาได้จากแอปและ
พร้อมให้คำแนะนำในช่องค้นหาด่วน หากต้องการกำหนดข้อความคำอธิบาย
สำหรับแอปที่ค้นหาได้ ให้เพิ่มแอตทริบิวต์ android:searchSettingsDescription
ลงในการกำหนดค่าที่ค้นหาได้ ดังที่แสดงในตัวอย่างต่อไปนี้
<?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.MyCustomSuggestionProvider" android:searchSuggestIntentAction="android.intent.action.VIEW" android:includeInGlobalSearch="true" android:searchSettingsDescription="@string/search_description" > </searchable>
สร้างสตริงสำหรับ android:searchSettingsDescription
ให้กระชับ
ที่สุดและระบุเนื้อหาที่ค้นหาได้ เช่น "ศิลปิน
อัลบั้ม และแทร็ก" สำหรับแอปเพลง หรือ "โน้ตที่บันทึกไว้" สำหรับแอป Notepad
การระบุคำอธิบายนี้เป็นสิ่งสำคัญเพื่อให้ผู้ใช้ทราบว่าระบบจะ
แนะนำอะไร ระบุแอตทริบิวต์นี้เสมอเมื่อ android:includeInGlobalSearch
เป็นจริง
เนื่องจากผู้ใช้ต้องไปที่เมนูการตั้งค่าเพื่อเปิดใช้คำแนะนำในการค้นหา สำหรับแอปของคุณ หากการค้นหาเป็นแง่มุมที่สำคัญของแอป ให้พิจารณาวิธี สื่อสารเรื่องนี้กับผู้ใช้ เช่น คุณอาจแสดงหมายเหตุในครั้งแรกที่ผู้ใช้เปิดแอปเพื่ออธิบายวิธีเปิดใช้คำแนะนำในการค้นหาสำหรับช่องค้นหาด่วน
จัดการทางลัดคำแนะนำของช่องค้นหาด่วน
ระบบจะเปลี่ยนคำแนะนำที่ผู้ใช้เลือกจากช่องค้นหาด่วนให้เป็นทางลัดโดยอัตโนมัติ คำแนะนำเหล่านี้เป็นคำแนะนำที่ระบบคัดลอกจากผู้ให้บริการเนื้อหาของคุณ เพื่อให้เข้าถึงคำแนะนำได้อย่างรวดเร็วโดยไม่ต้องค้นหาผู้ให้บริการเนื้อหาอีกครั้ง
โดยค่าเริ่มต้น ระบบจะเปิดใช้ตัวเลือกนี้สำหรับคำแนะนำทั้งหมดที่ดึงข้อมูลโดยช่องค้นหาด่วน แต่หากข้อมูลคำแนะนำมีการเปลี่ยนแปลงเมื่อเวลาผ่านไป คุณสามารถขอให้ระบบรีเฟรชทางลัดได้ เช่น หากคำแนะนำอ้างอิงถึงข้อมูลแบบไดนามิก เช่น สถานะการออนไลน์ของรายชื่อติดต่อ ให้ขอให้รีเฟรชทางลัดของคำแนะนำเมื่อแสดงต่อผู้ใช้ โดยใส่
SUGGEST_COLUMN_SHORTCUT_ID
ในตารางคำแนะนำ คุณใช้คอลัมน์นี้เพื่อกำหนดค่าลักษณะการทำงานของทางลัดสำหรับคำแนะนำแต่ละรายการได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
ทำให้ช่องค้นหาด่วนค้นหาผู้ให้บริการเนื้อหาอีกครั้งเพื่อรับ ทางลัดคำแนะนำเวอร์ชันล่าสุด
ระบุค่าในคอลัมน์
SUGGEST_COLUMN_SHORTCUT_ID
เพื่อให้ระบบค้นหาคำแนะนำอีกครั้งสำหรับเวอร์ชันล่าสุดทุกครั้งที่แสดงทางลัด ทางลัดจะแสดงข้อมูลที่มีล่าสุดอย่างรวดเร็ว จนกว่าการค้นหาการรีเฟรชจะแสดงผล จากนั้นระบบจะรีเฟรชคำแนะนำด้วยข้อมูลใหม่ ระบบจะส่งคำค้นหารีเฟรชไปยังผู้ให้บริการเนื้อหาของคุณโดยมีเส้นทาง URI เป็นSUGGEST_URI_PATH_SHORTCUT
แทนที่จะเป็นSUGGEST_URI_PATH_QUERY
ตรวจสอบว่า
Cursor
ที่คุณส่งกลับมีคำแนะนำ 1 รายการโดยใช้ คอลัมน์เดียวกันกับคำแนะนำเดิม หรือไม่มีข้อมูลใดๆ ซึ่งแสดงว่า ทางลัดใช้ไม่ได้อีกต่อไป ในกรณีนี้ คำแนะนำจะหายไป และระบบจะนำทางลัดออกหากคำแนะนำอ้างอิงถึงข้อมูลที่อาจใช้เวลานานกว่าในการรีเฟรช เช่น การรีเฟรชตามเครือข่าย คุณยังเพิ่มคอลัมน์
SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING
ลงในตารางคำแนะนำได้ด้วยค่าเป็นจริงเพื่อแสดงวงกลมหมุนแสดงความคืบหน้าสำหรับไอคอนด้านขวามือจนกว่าการรีเฟรชจะเสร็จสมบูรณ์ ค่าอื่นๆ ที่ไม่ใช่ true จะไม่แสดงวงกลมแสดงความคืบหน้าป้องกันไม่ให้มีการคัดลอกคำแนะนำลงในทางลัด
ระบุค่า
SUGGEST_NEVER_MAKE_SHORTCUT
ในคอลัมน์SUGGEST_COLUMN_SHORTCUT_ID
ในกรณีนี้ ระบบจะไม่คัดลอกคำแนะนำ ลงในทางลัด ขั้นตอนนี้จำเป็นเฉพาะในกรณีที่คุณ ไม่ต้องการให้คำแนะนำที่คัดลอกไว้ก่อนหน้านี้ปรากฏขึ้น หากคุณ ระบุค่าปกติสำหรับคอลัมน์ ทางลัดคำแนะนำ จะปรากฏจนกว่าการรีเฟรชคําค้นหาจะแสดงผลใช้ลักษณะการทำงานเริ่มต้นของแป้นพิมพ์ลัด
ปล่อยให้
SUGGEST_COLUMN_SHORTCUT_ID
ว่างไว้สำหรับแต่ละ คำแนะนำที่ไม่มีการเปลี่ยนแปลงและบันทึกเป็น ทางลัดได้
หากคำแนะนำไม่เคยเปลี่ยนแปลง คุณก็ไม่จำเป็นต้องใช้คอลัมน์ SUGGEST_COLUMN_SHORTCUT_ID
เกี่ยวกับการจัดอันดับคำแนะนำในช่องค้นหาแบบรวดเร็ว
เมื่อคุณทำให้คำแนะนำในการค้นหาของแอปพร้อมใช้งานใน Quick Search Box การจัดอันดับ Quick Search Box จะกำหนดวิธีแสดงคำแนะนำต่อผู้ใช้ สำหรับคำค้นหาหนึ่งๆ ซึ่งอาจขึ้นอยู่กับจำนวนแอปอื่นๆ ที่มีผลลัพธ์สำหรับคำค้นหานั้น และความถี่ที่ผู้ใช้เลือกผลลัพธ์ของคุณเมื่อเทียบกับผลลัพธ์จากแอปอื่นๆ เราไม่รับประกันเกี่ยวกับวิธีจัดอันดับคำแนะนำหรือคำแนะนำของแอปจะแสดงสำหรับการค้นหาที่ระบุหรือไม่ โดยทั่วไป การแสดงผลลัพธ์ที่มีคุณภาพจะเพิ่มโอกาสที่ระบบจะแสดงคำแนะนำของแอปในตำแหน่งที่โดดเด่น และแอปที่แสดงคำแนะนำคุณภาพต่ำมีแนวโน้มที่จะได้รับการจัดอันดับต่ำกว่าหรือไม่ได้แสดง