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

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

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

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

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

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

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

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

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

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

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

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

เมื่อคำแนะนำที่กำหนดเองปรากฏขึ้น สิ่งต่อไปนี้อาจเกิดขึ้น

  • หากผู้ใช้ป้อนตัวอักษรอื่นหรือเปลี่ยนคำค้นหาในลักษณะใดก็ตาม พารามิเตอร์ ที่ดำเนินขั้นตอนดังกล่าวซ้ำ และรายการคำแนะนำจะได้รับการอัปเดตตามนั้น
  • หากผู้ใช้ดำเนินการค้นหา ระบบจะไม่สนใจคำแนะนำและ ที่ส่งไปยังกิจกรรมที่ค้นหาได้ โดยใช้ Intent ACTION_SEARCH
  • หากผู้ใช้เลือกคำแนะนำ ระบบจะส่ง 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>

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

สร้างผู้ให้บริการเนื้อหา

หากต้องการสร้างผู้ให้บริการเนื้อหาสำหรับคำแนะนำที่กำหนดเอง โปรดดูก่อน ผู้ให้บริการเนื้อหา เพื่อดูวิธีสร้างผู้ให้บริการเนื้อหา ผู้ให้บริการเนื้อหาที่กำหนดเอง จะคล้ายกับผู้ให้บริการเนื้อหารายอื่น อย่างไรก็ตาม สำหรับ ตามที่คุณให้มา แถวที่เกี่ยวข้องใน 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 ของไฟล์การกำหนดค่าที่ค้นหาได้ หรือเป็นค่าว่างหากคุณไม่ ประกาศแอตทริบิวต์ android:searchSuggestSelection หัวข้อต่อไปนี้จะกล่าวถึงเรื่องนี้เพิ่มเติม
  4. selectionArgs
    มีคำค้นหาเป็นองค์ประกอบแรกและองค์ประกอบเดียวของอาร์เรย์ถ้า คุณจะประกาศแอตทริบิวต์ android:searchSuggestSelection ใน การกำหนดค่าที่ค้นหาได้ หากคุณไม่ประกาศ android:searchSuggestSelection พารามิเตอร์นี้จะเป็น Null หัวข้อต่อไปนี้จะอธิบายเรื่องนี้เพิ่มเติม
  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 ซึ่งกำหนดการดำเนินการของ 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 มีคอลัมน์นี้ ระบบจะแสดงคำแนะนำทั้งหมด ในรูปแบบไอคอนบวกข้อความพร้อมด้วยไอคอนที่ถอนออกได้ทางด้านซ้าย ช่วงเวลานี้ อาจเป็น Null หรือ 0 เพื่อระบุว่าไม่มีไอคอนในแถวนี้
SUGGEST_COLUMN_ICON_2
ทรัพยากรที่ถอนออกได้ เนื้อหา หรือสตริง URI ของไฟล์ หาก Cursor มีคอลัมน์นี้ ระบบจะแสดงคำแนะนำทั้งหมด ในรูปแบบไอคอนบวกข้อความ โดยมีไอคอนอยู่ด้านขวา ประเภท null หรือ 0 เพื่อระบุว่าไม่มีไอคอนในแถวนี้
SUGGEST_COLUMN_INTENT_ACTION
สตริงการดำเนินการผ่าน Intent หากมีคอลัมน์นี้อยู่และมีค่าที่ตำแหน่ง การทำงานที่กำหนดในที่นี้จะใช้ในการสร้างคำสั่ง Intent หากไม่ได้ระบุองค์ประกอบ ระบบจะดำเนินการจาก android:searchSuggestIntentAction ในช่องที่ค้นหาได้ของคุณ การกำหนดค่า หากการดำเนินการของคุณเหมือนกันทั้งหมดในทุกคำแนะนำจะ ที่มีประสิทธิภาพเพื่อระบุการดำเนินการโดยใช้ android:searchSuggestIntentAction และข้ามคอลัมน์นี้
SUGGEST_COLUMN_INTENT_DATA
สตริง URI ข้อมูล ถ้าคอลัมน์นี้มีอยู่และมีค่าใน ข้อมูลนี้จะใช้เมื่อสร้าง Intent ของคำแนะนำ หากองค์ประกอบ ไม่ได้ระบุไว้ เนื่องจากจะนำมาจาก android:searchSuggestIntentData ในช่องที่ค้นหาได้ของคุณ การกำหนดค่า หากไม่ระบุแหล่งที่มา ช่องข้อมูลของ Intent จะเป็น ค่าว่าง ข้อมูลในคำแนะนำทั้งหมดเหมือนกันหรืออธิบายได้ จะใช้ส่วนคงที่และรหัสที่เจาะจง การระบุจะมีประสิทธิภาพมากกว่า โดยใช้ android:searchSuggestIntentData และละเว้นค่านี้
SUGGEST_COLUMN_INTENT_DATA_ID
สตริงเส้นทาง URI ถ้าคอลัมน์นี้มีอยู่และมีค่าใน แล้วตามด้วย "/" และค่านี้จะต่อท้ายช่องข้อมูลใน Intent ใช้ตัวเลือกนี้เฉพาะเมื่อช่องข้อมูลที่ระบุโดย android:searchSuggestIntentData ในส่วน "ค้นหาได้" ตั้งค่าเป็นสตริงพื้นฐานที่เหมาะสมแล้ว
SUGGEST_COLUMN_INTENT_EXTRA_DATA
ข้อมูลที่กำหนดเอง หากมีคอลัมน์นี้อยู่และมีค่าในแถวที่ระบุ นี่คือข้อมูลเพิ่มเติมที่ใช้ในการสร้างจุดประสงค์ของคำแนะนำ หากไม่ระบุ ช่องข้อมูลเพิ่มเติมของ Intent จะเป็นค่าว่าง คอลัมน์นี้จะช่วยให้ คำแนะนำจะให้ข้อมูลเพิ่มเติมซึ่งรวมอยู่ในส่วนเสริมใน Intent EXTRA_DATA_KEY
SUGGEST_COLUMN_QUERY
หากมีคอลัมน์นี้และองค์ประกอบนี้อยู่ในแถวที่ระบุ ค่านี้จะ ข้อมูลที่ใช้ในการสร้างคำค้นหาของคำแนะนำ ซึ่งรวมถึง ในจุดประสงค์ของ วันที่ QUERY ต้องระบุหากการดำเนินการของคำแนะนำคือ ACTION_SEARCH แต่ไม่บังคับ
SUGGEST_COLUMN_SHORTCUT_ID
ใช้เมื่อให้คำแนะนำสำหรับช่อง Quick Search เท่านั้น คอลัมน์นี้ ระบุว่าจะต้องจัดเก็บการแนะนำการค้นหาเป็นทางลัดหรือไม่ ว่าจะต้องได้รับการตรวจสอบหรือไม่ โดยปกติ ทางลัดจะเกิดขึ้นเมื่อผู้ใช้ แตะคำแนะนำจากช่อง Quick Search หากไม่มี ผลลัพธ์จะจัดเก็บเป็น ทางลัดและไม่มีการรีเฟรช หากตั้งค่าเป็น SUGGEST_NEVER_MAKE_SHORTCUT, ระบบไม่ได้จัดเก็บผลลัพธ์เป็นทางลัด มิฉะนั้น ระบบจะใช้รหัสทางลัดเพื่อ โปรดกลับมาดูคำแนะนำล่าสุดโดยใช้ SUGGEST_URI_PATH_SHORTCUT
SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING
ใช้เมื่อให้คำแนะนำสำหรับช่อง Quick Search เท่านั้น คอลัมน์นี้ กำหนดว่าจะต้องแสดงไอคอนหมุนแทนไอคอนจาก SUGGEST_COLUMN_ICON_2ในขณะที่ทางลัดของคำแนะนำนี้คือ การรีเฟรชในช่องค้นหาแบบรวดเร็ว

คอลัมน์เหล่านี้ส่วนใหญ่จะอธิบายเพิ่มเติมในหัวข้อต่อไปนี้

ประกาศความตั้งใจสำหรับคำแนะนำ

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

ประกาศการดำเนินการผ่าน Intent

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

ขึ้นอยู่กับว่าคุณต้องการให้คำแนะนำทั้งหมดใช้การดำเนินการผ่าน Intent เดียวกันหรือไม่ คุณสามารถกำหนดการทำงานได้ 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 จากนั้น Intent ที่ระบุในแอตทริบิวต์ android:searchSuggestIntentAction คือ

ประกาศข้อมูลความตั้งใจ

เมื่อผู้ใช้เลือกคำแนะนำ กิจกรรมที่ค้นหาได้ของคุณจะได้รับ ความตั้งใจในการดำเนินการที่คุณกำหนด ตามที่กล่าวไปแล้วใน แต่ Intent นั้นต้องมีข้อมูลเพื่อให้กิจกรรมของคุณระบุได้ด้วย คำแนะนำที่เลือกไว้ โดยเฉพาะอย่างยิ่ง ข้อมูลต้องไม่ซ้ำกัน สําหรับคําแนะนําแต่ละรายการ เช่น รหัสแถวสําหรับคําแนะนําในตาราง SQLite เมื่อได้รับ Intent แล้ว คุณสามารถดึงข้อมูลที่แนบมาด้วย getData() หรือ getDataString()

คุณกําหนดข้อมูลที่รวมอยู่ใน Intent ได้ 2 วิธีดังนี้

  • กำหนดข้อมูลสำหรับคำแนะนำแต่ละรายการภายใน SUGGEST_COLUMN_INTENT_DATA ของตารางคำแนะนำ

    ระบุข้อมูลที่จำเป็นทั้งหมดสำหรับความตั้งใจแต่ละรายการในคำแนะนำ ตารางโดยรวมคอลัมน์ SUGGEST_COLUMN_INTENT_DATA และ จากนั้นให้ป้อนข้อมูลที่ไม่ซ้ำกันสำหรับแต่ละแถว ข้อมูลจากคอลัมน์นี้ จะแนบกับ Intent ที่คุณระบุในคอลัมน์นี้ทุกประการ คุณสามารถ จากนั้นดึงข้อมูลด้วย 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

จัดการความตั้งใจ

หลังจากใช้การแนะนำการค้นหาที่กำหนดเองด้วยความตั้งใจที่กำหนดเองแล้ว คุณต้อง กิจกรรมที่ค้นหาได้ของคุณเพื่อจัดการกับ 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 หรือรูปแบบข้อมูลอื่นๆ ที่มีวัตถุประสงค์ ที่ผู้ใช้มองเห็นได้ เช่น HTTP URL อย่าใช้รูปแบบ URI ภายในเพื่อเขียนใหม่ คำค้นหาในลักษณะนี้
  • ระบุสตริงข้อความค้นหาที่ไม่ซ้ำกันใน SUGGEST_COLUMN_QUERY ของตารางคำแนะนำ หากสิ่งนี้ มี คอลัมน์ และมีค่าสำหรับคำแนะนำปัจจุบัน ซึ่งเป็น ใช้เพื่อเขียนข้อความคำค้นหาใหม่และลบล้างข้อความก่อนหน้า การนำไปใช้งานจริง

แสดงคำแนะนำการค้นหาในช่อง Quick Search

เมื่อคุณกำหนดค่าแอปให้เสนอการแนะนำการค้นหาที่กำหนดเอง ซึ่งทำให้ ในช่อง Quick Search ที่เข้าถึงได้ทั่วโลกนั้นทำได้ง่าย เพียงแก้ไข การกำหนดค่าที่ค้นหาได้ของคุณที่จะรวม android:includeInGlobalSearch ที่มีค่า "true"

สถานการณ์เดียวที่จำเป็นต้องมีงานเพิ่มเติมคือเมื่อเนื้อหาของคุณ จะต้องมีสิทธิ์อ่าน ในกรณีนี้ คุณจะต้องเพิ่ม องค์ประกอบ <path-permission> สำหรับผู้ให้บริการที่จะให้สิทธิ์ Quick สิทธิ์การอ่านผู้ให้บริการเนื้อหาของคุณในช่องการค้นหา ดังที่แสดงใน ตัวอย่าง:

<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 เพื่อให้ค้นหาเนื้อหาของคุณได้

หากผู้ให้บริการเนื้อหาของคุณไม่บังคับใช้สิทธิ์การอ่าน Quick Search Box จะอ่านข้อความให้โดยค่าเริ่มต้น

เปิดใช้คำแนะนำในอุปกรณ์

โดยค่าเริ่มต้น แอปไม่ได้เปิดใช้งานเพื่อให้คำแนะนำในช่อง Quick Search แม้ว่าจะกำหนดค่าไว้ก็ตาม ผู้ใช้เลือกว่าจะรวมหรือไม่ จากแอปพลิเคชันของคุณในช่อง Quick Search ด้วยการเปิด Searchable รายการ - จะอยู่ในการตั้งค่า > ค้นหา และเปิดใช้ เป็นรายการที่ค้นหาได้

แต่ละแอปที่พร้อมใช้งานสำหรับช่อง Quick Search จะมีรายการใน หน้าการตั้งค่ารายการที่ค้นหาได้ รายการจะมีชื่อแอป และคำอธิบายสั้นๆ ว่าเนื้อหาที่สามารถค้นหาได้ จากแอปพลิเคชันและ ดูคำแนะนำได้ในช่อง Quick Search เพื่อกำหนดข้อความคำอธิบาย สำหรับแอปที่ค้นหาได้ ให้เพิ่ม 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 กระชับ มากที่สุดเท่าที่จะทำได้ และระบุเนื้อหาที่สามารถค้นหาได้ เช่น "ศิลปิน อัลบั้มและแทร็ก" สำหรับแอปเพลง หรือ "โน้ตที่บันทึกไว้" สำหรับแอปกระดาษโน้ต การให้คำอธิบายนี้เป็นสิ่งสำคัญ เพื่อให้ผู้ใช้ทราบว่า ให้ไว้ ให้ใส่แอตทริบิวต์นี้เสมอเมื่อ android:includeInGlobalSearch เป็นความจริง

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

จัดการทางลัดการแนะนำช่อง Quick Search

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

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

  • ให้ช่อง Quick Search สืบค้นข้อมูลจากผู้ให้บริการเนื้อหาของคุณอีกครั้ง ทางลัดการแนะนำ

    ระบุค่าในคอลัมน์ SUGGEST_COLUMN_SHORTCUT_ID สำหรับ ข้อเสนอแนะให้ค้นหาใหม่เป็นเวอร์ชันใหม่ทุกครั้งที่ทางลัด จะปรากฏขึ้น ทางลัดจะปรากฏพร้อมข้อมูลใดก็ตามที่มีมากที่สุดได้อย่างรวดเร็ว ที่ใช้ได้ล่าสุดจนกว่าการค้นหาการรีเฟรชจะแสดงผล คำแนะนำจะรีเฟรชด้วยข้อมูลใหม่ ข้อความค้นหาที่รีเฟรชคือ ที่ส่งไปยังผู้ให้บริการเนื้อหาด้วยเส้นทาง URI SUGGEST_URI_PATH_SHORTCUT แทน SUGGEST_URI_PATH_QUERY

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

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

  • ป้องกันการคัดลอกคำแนะนำลงในทางลัดเลย

    ระบุค่า SUGGEST_NEVER_MAKE_SHORTCUT ใน SUGGEST_COLUMN_SHORTCUT_ID ในกรณีนี้ ค่า จะไม่มีการคัดลอกคำแนะนำใดๆ ลงในทางลัด ซึ่งจำเป็นเฉพาะเมื่อคุณ ไม่ต้องการให้คำแนะนำที่คัดลอกไว้ก่อนหน้านี้ปรากฏขึ้น หากคุณ ระบุค่าปกติสำหรับคอลัมน์ จากนั้นป้อนทางลัดการแนะนำ จะปรากฏจนกว่าการค้นหาแบบรีเฟรชจะแสดงผลเท่านั้น

  • อนุญาตให้ใช้ลักษณะการทำงานของทางลัดเริ่มต้น

    เว้น SUGGEST_COLUMN_SHORTCUT_ID ว่างไว้สำหรับแต่ละรายการ ที่ไม่มีการเปลี่ยนแปลงและสามารถบันทึกเป็น ทางลัด

หากไม่มีคำแนะนำใดเปลี่ยนแปลงเลย คุณไม่จำเป็น SUGGEST_COLUMN_SHORTCUT_ID

เกี่ยวกับการจัดอันดับคำแนะนำของช่อง Quick Search

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