เพิ่มการแนะนำการค้นหาที่กำหนดเอง

ลองใช้ Compose
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนำสำหรับ Android ดูวิธีเพิ่มฟังก์ชันการค้นหาใน Compose

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

เมื่อระบุคำแนะนำที่กำหนดเองแล้ว คุณยังทำให้คำแนะนำดังกล่าวพร้อมใช้งานใน ช่องค้นหาด่วนทั้งระบบได้ด้วย ซึ่งจะช่วยให้เข้าถึงเนื้อหาจากภายนอกแอป ได้

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

ข้อมูลเบื้องต้น

รูปที่ 1 ภาพหน้าจอของกล่องโต้ตอบการค้นหาที่มี คำแนะนำการค้นหาที่กำหนดเอง

เมื่อผู้ใช้เลือกคำแนะนำที่กำหนดเอง ระบบจะส่ง Intent ไปยังกิจกรรมที่ค้นหาได้ของคุณ ไม่เหมือนกับคำค้นหาปกติที่ส่งเจตนาพร้อมกับ ACTION_SEARCH การดำเนินการ คุณสามารถกำหนดคำแนะนำที่กำหนดเองเพื่อใช้ ACTION_VIEWหรือ การดำเนินการเจตนาอื่นๆ แทนได้ และยังรวมข้อมูลที่เกี่ยวข้องกับ คำแนะนำที่เลือกไว้ได้ด้วย ในตัวอย่างพจนานุกรม เมื่อผู้ใช้เลือกคำแนะนำ แอปจะเปิดคำจำกัดความของคำนั้นได้ทันที แทนที่จะค้นหาคำที่ตรงกันในพจนานุกรม

หากต้องการให้คำแนะนำที่กำหนดเอง ให้ทำตามขั้นตอนต่อไปนี้

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

ระบบ Android จะแสดงกล่องโต้ตอบการค้นหาและ คำแนะนำในการค้นหา คุณต้องมีผู้ให้บริการเนื้อหาที่ระบบสามารถ ดึงคำแนะนำของคุณได้ อ่านส่วนผู้ให้บริการเนื้อหา เพื่อดูวิธีสร้างผู้ให้บริการเนื้อหา

เมื่อระบบระบุว่ากิจกรรมของคุณค้นหาได้และแสดงคำแนะนำในการค้นหา กระบวนการต่อไปนี้จะเกิดขึ้นเมื่อผู้ใช้ป้อนคำค้นหา

  1. ระบบจะนำข้อความคำค้นหา ซึ่งหมายถึงข้อความที่ป้อน จนถึงตอนนี้ ไปทำการค้นหาในผู้ให้บริการเนื้อหาที่จัดการ คำแนะนำของคุณ
  2. ผู้ให้บริการเนื้อหาจะแสดง Cursor ซึ่งชี้ไปยังคำแนะนำทั้งหมดที่เกี่ยวข้องกับข้อความค้นหา
  3. ระบบจะแสดงรายการคำแนะนำที่ 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() ของคุณ โดยเรียงตามลำดับ

  1. 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 จำเป็นเฉพาะในกรณีที่คุณใช้ผู้ให้บริการเนื้อหารายเดียวกันสำหรับกิจกรรมที่ค้นหาได้หลายรายการ หาก เป็นเช่นนี้ ให้ระบุแหล่งที่มาของคำค้นหาที่แนะนำ

  2. projection
    ไม่มีค่าเสมอ
  3. selection
    ค่าที่ระบุในแอตทริบิวต์ android:searchSuggestSelection ของไฟล์การกำหนดค่าที่ค้นหาได้ หรือ null หากคุณไม่ได้ ประกาศแอตทริบิวต์ android:searchSuggestSelection ส่วนต่อไปนี้จะอธิบายเรื่องนี้เพิ่มเติม
  4. selectionArgs
    มีคำค้นหาเป็นองค์ประกอบแรกและองค์ประกอบเดียวของอาร์เรย์ หากคุณประกาศแอตทริบิวต์ android:searchSuggestSelection ใน การกำหนดค่าที่ค้นหาได้ หากไม่ได้ประกาศ android:searchSuggestSelection พารามิเตอร์นี้จะเป็นค่าว่าง ส่วนต่อไปนี้จะอธิบายเรื่องนี้เพิ่มเติม
  5. 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 จะกำหนดวิธีแสดงคำแนะนำต่อผู้ใช้ สำหรับคำค้นหาหนึ่งๆ ซึ่งอาจขึ้นอยู่กับจำนวนแอปอื่นๆ ที่มีผลลัพธ์สำหรับคำค้นหานั้น และความถี่ที่ผู้ใช้เลือกผลลัพธ์ของคุณเมื่อเทียบกับผลลัพธ์จากแอปอื่นๆ เราไม่รับประกันเกี่ยวกับวิธีจัดอันดับคำแนะนำหรือคำแนะนำของแอปจะแสดงสำหรับการค้นหาที่ระบุหรือไม่ โดยทั่วไป การแสดงผลลัพธ์ที่มีคุณภาพจะเพิ่มโอกาสที่ระบบจะแสดงคำแนะนำของแอปในตำแหน่งที่โดดเด่น และแอปที่แสดงคำแนะนำคุณภาพต่ำมีแนวโน้มที่จะได้รับการจัดอันดับต่ำกว่าหรือไม่ได้แสดง