เมื่อใช้กล่องโต้ตอบการค้นหาหรือวิดเจ็ตการค้นหาของ Android คุณจะให้คำแนะนำการค้นหาที่กำหนดเองซึ่งสร้างจากข้อมูลในแอปได้ เช่น หากแอปเป็นพจนานุกรม คุณจะแนะนำคำจากพจนานุกรมที่ตรงกับข้อความที่ป้อนในช่องค้นหาก่อนที่ผู้ใช้จะป้อนคำค้นหาเสร็จได้ คำแนะนำเหล่านี้มีประโยชน์เนื่องจากสามารถคาดการณ์ได้อย่างมีประสิทธิภาพ ว่าผู้ใช้ต้องการอะไรและให้สิทธิ์เข้าถึงได้ทันที รูปที่ 1 แสดงตัวอย่าง กล่องโต้ตอบการค้นหาพร้อมคำแนะนำที่กำหนดเอง
เมื่อระบุคำแนะนำที่กำหนดเองแล้ว คุณยังทำให้คำแนะนำเหล่านั้นพร้อมใช้งานใน ช่องค้นหาแบบรวดเร็วทั้งระบบได้ด้วย ซึ่งจะช่วยให้เข้าถึงเนื้อหาจากภายนอกแอป ได้
ก่อนเพิ่มคำแนะนำที่กำหนดเอง ให้ใช้กล่องโต้ตอบการค้นหาของ Android หรือ วิดเจ็ตการค้นหาสำหรับการค้นหาในแอปของคุณ ดูสร้าง อินเทอร์เฟซการค้นหาและ ผู้ให้บริการ เนื้อหา
ข้อมูลเบื้องต้น
รูปที่ 1 ภาพหน้าจอของกล่องโต้ตอบการค้นหาที่มี คำแนะนำการค้นหาที่กำหนดเอง
เมื่อผู้ใช้เลือกคำแนะนำที่กำหนดเอง ระบบจะส่ง
Intent ไปยัง
กิจกรรมที่ค้นหาได้ ไม่เหมือนกับคำค้นหาปกติที่ส่ง Intent พร้อมด้วย
ACTION_SEARCH
การดำเนินการ คุณสามารถกำหนดคำแนะนำที่กำหนดเองให้ใช้
ACTION_VIEWหรือ
การดำเนินการ Intent อื่นๆ แทนได้ และยังรวมข้อมูลที่เกี่ยวข้องกับ
คำแนะนำที่เลือกไว้ได้ด้วย ในตัวอย่างพจนานุกรม เมื่อผู้ใช้เลือกคำแนะนำ แอปจะเปิดคำจำกัดความของคำนั้นได้ทันที แทนที่จะค้นหาคำที่ตรงกันในพจนานุกรม
หากต้องการให้คำแนะนำที่กำหนดเอง ให้ทำตามขั้นตอนต่อไปนี้
- ใช้กิจกรรมที่ค้นหาได้ขั้นพื้นฐานตามที่อธิบายไว้ใน สร้างอินเทอร์เฟซการค้นหา
- แก้ไขการกำหนดค่าที่ค้นหาได้ด้วยข้อมูลเกี่ยวกับผู้ให้บริการเนื้อหาที่ให้คำแนะนำที่กำหนดเอง
- สร้างตาราง เช่น ใน
SQLiteDatabaseสำหรับคำแนะนำของคุณ แล้วจัดรูปแบบตารางด้วยคอลัมน์ที่จำเป็น - สร้างผู้ให้บริการ เนื้อหาที่มีสิทธิ์เข้าถึงตารางคำแนะนำและประกาศผู้ให้บริการในไฟล์ Manifest
- ประกาศประเภทของ
Intentที่จะส่งเมื่อผู้ใช้เลือกคำแนะนำ รวมถึงการดำเนินการที่กำหนดเองและข้อมูลที่กำหนดเอง
ระบบ Android จะแสดงกล่องโต้ตอบการค้นหาและแสดง คำแนะนำในการค้นหาของคุณ คุณต้องมีผู้ให้บริการเนื้อหาที่ระบบสามารถ ดึงคำแนะนำของคุณได้ อ่านส่วนผู้ให้บริการเนื้อหา เพื่อดูวิธีสร้างผู้ให้บริการเนื้อหา
เมื่อระบบระบุว่ากิจกรรมของคุณค้นหาได้และแสดงคำแนะนำในการค้นหา กระบวนการต่อไปนี้จะเกิดขึ้นเมื่อผู้ใช้ป้อนคำค้นหา
- ระบบจะนำข้อความคำค้นหา ซึ่งหมายถึงข้อความที่ป้อน ไปจนถึงตอนนี้ ไปทำการค้นหาในผู้ให้บริการเนื้อหาที่จัดการคำแนะนำ ของคุณ
- ผู้ให้บริการเนื้อหาจะแสดง
Cursorซึ่งชี้ไปยังคำแนะนำทั้งหมดที่เกี่ยวข้องกับข้อความค้นหา - ระบบจะแสดงรายการคำแนะนำที่
Cursorระบุ
เมื่อคำแนะนำที่กำหนดเองแสดงขึ้น อาจเกิดสิ่งต่อไปนี้
- หากผู้ใช้ป้อนตัวอักษรอื่นหรือเปลี่ยนคำค้นหาไม่ว่าในลักษณะใด ขั้นตอนก่อนหน้าจะทำซ้ำและรายการคำแนะนำจะอัปเดตตามนั้น
- หากผู้ใช้ดำเนินการค้นหา ระบบจะละเว้นคำแนะนำและส่งการค้นหาไปยังกิจกรรมที่ค้นหาได้โดยใช้
ACTION_SEARCHIntent ปกติ - หากผู้ใช้เลือกคำแนะนำ ระบบจะส่ง 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พารามิเตอร์นี้จะเป็นค่า Null ส่วนต่อไปนี้จะอธิบายเรื่องนี้เพิ่มเติม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 ซึ่งกําหนดการดำเนินการผ่าน Intent
ที่ส่งพร้อมกับ Intent แต่ละอย่างเมื่อผู้ใช้เลือกคําแนะนํา ซึ่งจะกล่าวถึง
เพิ่มเติมในส่วนประกาศความตั้งใจสำหรับ
คำแนะนำ
สร้างตารางคำแนะนำ
เมื่อคุณส่งคำแนะนำกลับไปยังระบบด้วย Cursor ระบบจะคาดหวังคอลัมน์ที่เฉพาะเจาะจงในแต่ละแถว ไม่ว่าคุณจะจัดเก็บข้อมูลคำแนะนำในฐานข้อมูล SQLite บนอุปกรณ์ ฐานข้อมูลบนเว็บเซิร์ฟเวอร์ หรือรูปแบบอื่นบนอุปกรณ์หรือเว็บ ให้จัดรูปแบบคำแนะนำเป็นแถวในตารางและนำเสนอด้วย Cursor
ระบบเข้าใจคอลัมน์หลายคอลัมน์ แต่มีเพียง 2 คอลัมน์เท่านั้นที่จำเป็น ได้แก่
_ID- รหัสแถวจำนวนเต็มที่ไม่ซ้ำกันสำหรับคำแนะนำแต่ละรายการ ระบบต้องการข้อมูลนี้เพื่อ
แสดงคำแนะนำใน
ListView SUGGEST_COLUMN_TEXT_1- สตริงที่แสดงเป็นคำแนะนำ
คอลัมน์ต่อไปนี้จะมีหรือไม่ก็ได้ เราจะอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับข้อกำหนดส่วนใหญ่ในส่วนต่อไปนี้
SUGGEST_COLUMN_TEXT_2- สตริง หาก
Cursorมีคอลัมน์นี้ ระบบจะแสดงคำแนะนำทั้งหมดในรูปแบบ 2 บรรทัด สตริงในคอลัมน์นี้จะ แสดงเป็นบรรทัดข้อความที่ 2 ซึ่งมีขนาดเล็กกว่าข้อความ คำแนะนำหลัก อาจเป็น Null หรือว่างเปล่าเพื่อระบุว่าไม่มีข้อความรอง SUGGEST_COLUMN_ICON_1- สตริง URI ของทรัพยากรที่วาดได้ เนื้อหา หรือไฟล์ หาก
Cursorมีคอลัมน์นี้ ระบบจะแสดงคำแนะนำทั้งหมด ในรูปแบบไอคอนบวกข้อความโดยมีไอคอนที่วาดได้อยู่ทางด้านซ้าย ซึ่ง อาจเป็นค่าว่างหรือ 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ในการกำหนดค่าที่ค้นหาได้ หากไม่มีการระบุแหล่งที่มาใดๆ ฟิลด์ข้อมูลของ 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- หากมีคอลัมน์นี้และมีองค์ประกอบนี้ในแถวที่ระบุ ข้อมูลนี้จะเป็นข้อมูลที่ใช้เมื่อสร้างคำค้นหาของคำแนะนำ โดยจะรวมเป็นข้อมูลพิเศษในคีย์ของ Intent
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
การดำเนินการผ่าน Intent ที่พบบ่อยที่สุดสำหรับคำแนะนำที่กำหนดเองคือ
ACTION_VIEW ซึ่งเหมาะสมเมื่อคุณต้องการเปิดบางสิ่ง
เช่น คำจำกัดความของคำ ข้อมูลติดต่อของบุคคล หรือหน้าเว็บ
อย่างไรก็ตาม การดำเนินการผ่าน Intent อาจเป็นการดำเนินการอื่นๆ และอาจแตกต่างกันไปสำหรับแต่ละคำแนะนำ
คุณกำหนดการดำเนินการได้ 2 วิธีโดยขึ้นอยู่กับว่าต้องการให้คำแนะนำทั้งหมดใช้การดำเนินการผ่าน Intent เดียวกันหรือไม่
- ใช้แอตทริบิวต์
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); }
ในตัวอย่างนี้ การดำเนินการผ่าน Intent คือ 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
เกี่ยวกับการจัดอันดับคำแนะนำในช่องค้นหาแบบรวดเร็ว
เมื่อคุณทำให้คำแนะนำในการค้นหาของแอปพร้อมใช้งานในช่องค้นหาแบบรวดเร็วแล้ว การจัดอันดับช่องค้นหาแบบรวดเร็วจะกำหนดวิธีแสดงคำแนะนำต่อผู้ใช้สำหรับคำค้นหาหนึ่งๆ ซึ่งอาจขึ้นอยู่กับจำนวนแอปอื่นๆ ที่มีผลลัพธ์สำหรับคำค้นหานั้น และความถี่ที่ผู้ใช้เลือกผลลัพธ์ของคุณเมื่อเทียบกับผลลัพธ์จากแอปอื่นๆ เราไม่รับประกันเกี่ยวกับวิธีจัดอันดับคำแนะนำหรือการแสดงคำแนะนำของแอปสำหรับการค้นหาที่เฉพาะเจาะจง โดยทั่วไปแล้ว การให้ผลลัพธ์ที่มีคุณภาพจะเพิ่มโอกาสที่ระบบจะแสดงคำแนะนำของแอปในตำแหน่งที่โดดเด่น และแอปที่ให้คำแนะนำคุณภาพต่ำมีแนวโน้มที่จะได้รับการจัดอันดับต่ำกว่าหรือไม่ได้แสดง