สร้างอินเทอร์เฟซการค้นหา

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

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

ฟีเจอร์อื่นๆ ที่ใช้ได้กับกล่องโต้ตอบและวิดเจ็ตการค้นหา ได้แก่

  • ค้นหาด้วยเสียง
  • คำแนะนำในการค้นหาตามคำค้นหาล่าสุด
  • คำแนะนำในการค้นหาที่ตรงกับผลลัพธ์จริงในข้อมูลแอป

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

แหล่งข้อมูลที่เกี่ยวข้อง

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

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

  • กล่องโต้ตอบการค้นหาเป็นคอมโพเนนต์ UI ที่ควบคุมโดยระบบ Android เมื่อผู้ใช้เปิดใช้งาน กล่องโต้ตอบการค้นหาจะปรากฏที่ ด้านบนของกิจกรรม

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

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

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

  • การกำหนดค่าการค้นหา
    ไฟล์ XML ที่กำหนดการตั้งค่าบางอย่างสำหรับกล่องโต้ตอบหรือวิดเจ็ตการค้นหา ซึ่งรวมถึงการตั้งค่าสำหรับฟีเจอร์ต่างๆ เช่น การค้นหาด้วยเสียง คำแนะนำในการค้นหา และข้อความคำใบ้สำหรับช่องค้นหา
  • กิจกรรมที่ค้นหาได้
    Activity ที่รับคำค้นหา ค้นหาข้อมูล และแสดงผลการค้นหา
  • อินเทอร์เฟซการค้นหาที่ให้บริการโดยแหล่งข้อมูลต่อไปนี้
    • กล่องโต้ตอบการค้นหา
      โดยค่าเริ่มต้น กล่องโต้ตอบการค้นหาจะซ่อนอยู่ โดยจะปรากฏที่ด้านบนของหน้าจอเมื่อคุณโทร onSearchRequested() เมื่อผู้ใช้แตะปุ่มค้นหาของคุณ
    • วิดเจ็ต SearchView
      การใช้วิดเจ็ตค้นหาช่วยให้คุณวางช่องค้นหาไว้ที่ใดก็ได้ในกิจกรรม รวมถึงเป็นมุมมองการดำเนินการในแถบแอป

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

สร้างการกำหนดค่าที่ค้นหาได้

สิ่งแรกที่คุณต้องมีคือไฟล์ XML ที่เรียกว่าการกำหนดค่าการค้นหา โดยจะกำหนดค่าลักษณะ UI บางอย่างของกล่องโต้ตอบหรือวิดเจ็ตการค้นหา และกำหนดลักษณะการทำงานของฟีเจอร์ต่างๆ เช่น คำแนะนำและการค้นหาด้วยเสียง โดยปกติแล้วไฟล์นี้จะมีชื่อว่า searchable.xml และต้องบันทึกไว้ในไดเรกทอรีโปรเจ็กต์ res/xml/

ไฟล์การกำหนดค่าการค้นหาต้องมีองค์ประกอบ <searchable> เป็นโหนดรูท และระบุแอตทริบิวต์อย่างน้อย 1 รายการ ดังที่แสดงใน ตัวอย่างต่อไปนี้

<?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" >
</searchable>

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

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

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

สร้างกิจกรรมที่ค้นหาได้

กิจกรรมที่ค้นหาได้คือ Activity ในแอปที่ทำการค้นหาตามสตริงการค้นหาและแสดงผลการค้นหา

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

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

ประกาศกิจกรรมที่ค้นหาได้

หากยังไม่มี ให้สร้าง Activity ที่ทำการค้นหาและแสดงผลลัพธ์ คุณยังไม่จำเป็นต้องใช้ฟังก์ชันการค้นหา เพียงสร้างกิจกรรมที่คุณประกาศใน ไฟล์ Manifest ได้ ภายในองค์ประกอบ <activity> ของไฟล์ Manifest ให้ทำดังนี้

  1. ประกาศกิจกรรมเพื่อยอมรับACTION_SEARCHเจตนาในองค์ประกอบ <intent-filter>
  2. ระบุการกำหนดค่าการค้นหาที่จะใช้ในองค์ประกอบ <meta-data>

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการดำเนินการนี้

<application ... >
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>
    ...
</application>

องค์ประกอบ <meta-data> ต้องมีแอตทริบิวต์ android:name ที่มีค่า "android.app.searchable" และแอตทริบิวต์ android:resource ที่มีการอ้างอิงถึงไฟล์การกำหนดค่าที่ค้นหาได้ ในตัวอย่างก่อนหน้า คำว่า "ไฟล์" หมายถึงไฟล์ res/xml/searchable.xml

ทำการค้นหา

หลังจากประกาศกิจกรรมที่ค้นหาได้ในไฟล์ Manifest แล้ว ให้ทำตาม ขั้นตอนต่อไปนี้เพื่อค้นหาในกิจกรรมที่ค้นหาได้

  1. รับการค้นหา
  2. ค้นหาข้อมูล
  3. นำเสนอผลลัพธ์

รับการค้นหา

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

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.search)

    // Verify the action and get the query.
    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            doMySearch(query)
        }
    }
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);

    // Get the intent, verify the action, and get the query.
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
}

สตริง QUERY จะรวมอยู่กับเจตนา ACTION_SEARCH เสมอ ในตัวอย่างก่อนหน้า ระบบจะดึงข้อมูลคำค้นหาและส่งไปยังเมธอด doMySearch() ในเครื่อง ซึ่งจะดำเนินการค้นหาจริง

ค้นหาข้อมูล

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

  • หากจัดเก็บข้อมูลไว้ในฐานข้อมูล SQLite ในอุปกรณ์ การดำเนินการ การค้นหาแบบข้อความแบบเต็มโดยใช้ FTS3 แทนLIKE การค้นหาจะช่วยให้ค้นหาข้อมูลข้อความได้มีประสิทธิภาพมากขึ้นและ แสดงผลลัพธ์ได้เร็วกว่ามาก ดูข้อมูลเกี่ยวกับ FTS3 และคลาส SQLiteDatabase ได้ที่ sqlite.org และดูข้อมูลเกี่ยวกับ SQLite ใน Android ได้ที่ SQLiteDatabase
  • หากจัดเก็บข้อมูลไว้ทางออนไลน์ ประสิทธิภาพการค้นหาที่รับรู้ได้อาจ ถูกจำกัดโดยการเชื่อมต่อข้อมูลของผู้ใช้ คุณอาจต้องการแสดง ตัวบ่งชี้ความคืบหน้าจนกว่าการค้นหาจะแสดงผล ดู android.net เพื่อดูข้อมูลอ้างอิงของ API เครือข่าย และ ProgressBar เพื่อดูข้อมูลเกี่ยวกับวิธีแสดงตัวบ่งชี้ความคืบหน้า

นำเสนอผลลัพธ์

ไม่ว่าข้อมูลจะอยู่ที่ใดและคุณจะค้นหาข้อมูลอย่างไร เราขอแนะนําให้คุณ ส่งผลการค้นหากลับไปยังกิจกรรมที่ค้นหาได้พร้อมด้วย Adapter วิธีนี้จะช่วยให้คุณแสดงผลการค้นหาทั้งหมดในRecyclerViewได้ หากข้อมูลมาจากการค้นหาฐานข้อมูล SQLite คุณสามารถใช้ผลลัพธ์กับ RecyclerView ได้โดยใช้ CursorAdapter หากข้อมูลอยู่ในรูปแบบอื่น คุณจะสร้างส่วนขยายของ BaseAdapterได้

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

ใช้กล่องโต้ตอบการค้นหา

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

โดยค่าเริ่มต้น กล่องโต้ตอบการค้นหาจะซ่อนอยู่เสมอจนกว่าผู้ใช้จะเปิดใช้งาน แอปของคุณสามารถเปิดใช้งานกล่องโต้ตอบการค้นหาได้โดยการเรียก onSearchRequested() อย่างไรก็ตาม วิธีนี้จะใช้ไม่ได้จนกว่าคุณจะ เปิดใช้กล่องโต้ตอบการค้นหาสำหรับกิจกรรม

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

หากต้องการประกาศกิจกรรมที่ค้นหาได้สำหรับกล่องโต้ตอบการค้นหาของกิจกรรม ให้เพิ่มองค์ประกอบ <meta-data>ภายในองค์ประกอบ <activity>ของกิจกรรมที่เกี่ยวข้อง องค์ประกอบ <meta-data> ต้องมีแอตทริบิวต์ android:value ที่ระบุ ชื่อคลาสของกิจกรรมที่ค้นหาได้ และแอตทริบิวต์ android:name ที่มีค่าเป็น "android.app.default_searchable"

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

<application ... >
    <!-- This is the searchable activity; it performs searches. -->
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>

    <!-- This activity enables the search dialog to initiate searches
         in the SearchableActivity. -->
    <activity android:name=".OtherActivity" ... >
        <!-- Enable the search dialog to send searches to SearchableActivity. -->
        <meta-data android:name="android.app.default_searchable"
                   android:value=".SearchableActivity" />
    </activity>
    ...
</application>

เนื่องจากตอนนี้ OtherActivity มีองค์ประกอบ <meta-data> เพื่อประกาศกิจกรรมที่ค้นหาได้ซึ่งจะใช้สำหรับการค้นหา กิจกรรมจึงเปิดใช้กล่องโต้ตอบการค้นหา แม้ว่าผู้ใช้จะอยู่ในกิจกรรมนี้ แต่เมธอด onSearchRequested() จะเปิดใช้งานกล่องโต้ตอบการค้นหา เมื่อผู้ใช้ทำการค้นหา ระบบจะเริ่ม SearchableActivityและส่ง ACTION_SEARCH Intent ไปให้

หากต้องการให้ทุกกิจกรรมในแอปแสดงกล่องโต้ตอบการค้นหา ให้แทรกองค์ประกอบ <meta-data> ที่อยู่ก่อนหน้าเป็นองค์ประกอบย่อยขององค์ประกอบ <application> แทนที่จะแทรกในแต่ละ <activity> ด้วยวิธีนี้ กิจกรรมทุกอย่าง จะรับค่า สืบทอดค่า ให้กล่องโต้ตอบการค้นหา และส่งการค้นหาไปยัง กิจกรรมที่ค้นหาได้เดียวกัน หากมีกิจกรรมที่ค้นหาได้หลายรายการ คุณสามารถ ลบล้างกิจกรรมที่ค้นหาได้เริ่มต้นโดยวาง <meta-data>ประกาศอื่นไว้ภายในกิจกรรมแต่ละรายการ

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

เรียกใช้กล่องโต้ตอบการค้นหา

แม้ว่าอุปกรณ์บางรุ่นจะมีปุ่มค้นหาโดยเฉพาะ แต่ลักษณะการทำงานของปุ่มอาจแตกต่างกันไปในแต่ละอุปกรณ์ และอุปกรณ์หลายรุ่นไม่มีปุ่มค้นหาเลย ดังนั้นเมื่อใช้กล่องโต้ตอบการค้นหา คุณต้องระบุปุ่มค้นหา ใน UI ที่เปิดใช้งานกล่องโต้ตอบการค้นหาโดยการเรียกใช้ onSearchRequested()

เช่น เพิ่มปุ่มค้นหาในเมนูตัวเลือกหรือเลย์เอาต์ UI ที่เรียกใช้ onSearchRequested()

นอกจากนี้ คุณยังเปิดใช้ฟังก์ชัน "พิมพ์เพื่อค้นหา" ได้ด้วย ซึ่งจะเปิดใช้งาน กล่องโต้ตอบการค้นหาเมื่อผู้ใช้เริ่มพิมพ์บนแป้นพิมพ์ ระบบจะแทรกการกดแป้นลงในกล่องโต้ตอบการค้นหา คุณเปิดใช้การพิมพ์เพื่อค้นหาในกิจกรรมได้ โดยเรียกใช้ setDefaultKeyModeหรือ DEFAULT_KEYS_SEARCH_LOCALระหว่าง กิจกรรม onCreate()

ผลกระทบของกล่องโต้ตอบการค้นหาต่อวงจรชีวิตของกิจกรรม

กล่องโต้ตอบการค้นหาคือDialogที่ลอยอยู่ ที่ด้านบนของหน้าจอ ซึ่งจะไม่ทำให้เกิดการเปลี่ยนแปลงใดๆ ในสแต็กกิจกรรม ดังนั้นเมื่อกล่องโต้ตอบการค้นหาปรากฏขึ้น ระบบจะไม่เรียกใช้เมธอดวงจรของกิจกรรม เช่น onPause() กิจกรรมจะสูญเสียโฟกัสอินพุตเนื่องจากโฟกัสอินพุตจะไปอยู่ที่ กล่องโต้ตอบการค้นหา

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

Kotlin

override fun onSearchRequested(): Boolean {
    pauseSomeStuff()
    return super.onSearchRequested()
}

Java

@Override
public boolean onSearchRequested() {
    pauseSomeStuff();
    return super.onSearchRequested();
}

หากผู้ใช้ยกเลิกการค้นหาโดยแตะปุ่มย้อนกลับ กล่องโต้ตอบการค้นหาจะปิดลงและกิจกรรมจะกลับมามีโฟกัสอินพุตอีกครั้ง คุณลงทะเบียนเพื่อรับการแจ้งเตือนได้ เมื่อปิดกล่องโต้ตอบการค้นหาด้วย setOnDismissListener() setOnCancelListener() หรือทั้ง 2 อย่าง คุณต้องลงทะเบียน OnDismissListener เนื่องจากระบบจะเรียกใช้ทุกครั้งที่ปิดกล่องโต้ตอบการค้นหา OnCancelListener ใช้กับเหตุการณ์ที่ผู้ใช้ออกจากกล่องโต้ตอบการค้นหาอย่างชัดเจนเท่านั้น จึง จะไม่เรียกใช้เมื่อมีการค้นหา เมื่อดำเนินการค้นหา กล่องโต้ตอบการค้นหาจะหายไปโดยอัตโนมัติ

หากกิจกรรมปัจจุบันไม่ใช่กิจกรรมที่ค้นหาได้ ระบบจะทริกเกอร์เหตุการณ์วงจรของกิจกรรมปกติ เมื่อผู้ใช้ทำการค้นหา กิจกรรมปัจจุบันจะได้รับ onPause() ตามที่อธิบายไว้ ในข้อมูลเบื้องต้นเกี่ยวกับ กิจกรรม อย่างไรก็ตาม หากกิจกรรมปัจจุบันเป็นกิจกรรมที่ค้นหาได้ ระบบจะดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

  • โดยค่าเริ่มต้น กิจกรรมที่ค้นหาได้จะได้รับ เจตนา ACTION_SEARCH พร้อมการเรียกไปยัง onCreate() และระบบจะนำอินสแตนซ์ใหม่ของกิจกรรมไปไว้ที่ด้านบนของสแต็กกิจกรรม ตอนนี้กิจกรรมที่ค้นหาได้ของคุณมี 2 อินสแตนซ์ใน สแต็กกิจกรรม ดังนั้นการแตะปุ่มย้อนกลับจะนำคุณกลับไปยังอินสแตนซ์ก่อนหน้า ของกิจกรรมที่ค้นหาได้ แทนที่จะออกจากกิจกรรมที่ค้นหาได้
  • หากคุณตั้งค่า android:launchMode เป็น "singleTop" กิจกรรมที่ค้นหาได้จะได้รับความตั้งใจ ACTION_SEARCH พร้อมการเรียกไปยัง onNewIntent(Intent) โดยส่งความตั้งใจ ACTION_SEARCH ใหม่ ตัวอย่างเช่น วิธีที่คุณอาจจัดการกรณีนี้ซึ่งโหมดการเปิดใช้ของกิจกรรมที่ค้นหาได้ คือ "singleTop"

    Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.search)
        handleIntent(intent)
    }
    
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        handleIntent(intent)
    }
    
    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            intent.getStringExtra(SearchManager.QUERY)?.also { query ->
                doMySearch(query)
            }
        }
    }

    Java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);
        handleIntent(getIntent());
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        handleIntent(intent);
    }
    
    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
          String query = intent.getStringExtra(SearchManager.QUERY);
          doMySearch(query);
        }
    }

    เมื่อเทียบกับโค้ดตัวอย่างในส่วนเกี่ยวกับการค้นหา โค้ดทั้งหมดที่ใช้จัดการเจตนาในการค้นหาจะอยู่ในเมธอด handleIntent() เพื่อให้ทั้ง onCreate() และ onNewIntent() เรียกใช้ได้

    เมื่อระบบเรียกใช้ onNewIntent(Intent) กิจกรรมจะไม่ รีสตาร์ท ดังนั้นเมธอด getIntent() จะแสดง Intent เดียวกันกับที่ได้รับด้วย onCreate() ด้วยเหตุนี้ คุณจึงต้องเรียกใช้ setIntent(Intent) ภายใน onNewIntent(Intent) เพื่อให้ระบบอัปเดต Intent ที่กิจกรรมบันทึกไว้ในกรณีที่คุณเรียกใช้ getIntent() ในอนาคต

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

<activity android:name=".SearchableActivity"
          android:launchMode="singleTop" >
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
          android:name="android.app.searchable"
          android:resource="@xml/searchable"/>
  </activity>

ส่งข้อมูลบริบทการค้นหา

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

หากต้องการส่งข้อมูลประเภทนี้ไปยังกิจกรรมที่ค้นหาได้ ให้ลบล้างเมธอด onSearchRequested()สำหรับกิจกรรมที่ผู้ใช้สามารถ ค้นหา สร้าง Bundle ที่มีข้อมูลเพิ่มเติม และเรียกใช้ startSearch() เพื่อเปิดใช้งานกล่องโต้ตอบการค้นหา เช่น

Kotlin

override fun onSearchRequested(): Boolean {
    val appData = Bundle().apply {
        putBoolean(JARGON, true)
    }
    startSearch(null, false, appData, false)
    return true
}

Java

@Override
public boolean onSearchRequested() {
     Bundle appData = new Bundle();
     appData.putBoolean(SearchableActivity.JARGON, true);
     startSearch(null, false, appData, false);
     return true;
 }

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

Kotlin

val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false

Java

Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
    boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}

ใช้วิดเจ็ตค้นหา

รูปภาพที่แสดงมุมมองการค้นหาในแถบด้านบนของแอป

รูปที่ 1 SearchViewวิดเจ็ตเป็น มุมมองการดำเนินการในแถบแอป

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

กำหนดค่าวิดเจ็ตค้นหา

หลังจากสร้างการกำหนดค่าการค้นหาและกิจกรรมที่ค้นหาได้แล้ว ให้เปิดใช้การค้นหาที่แนะนำ สำหรับแต่ละ SearchView โดยเรียกใช้ setSearchableInfo() และส่งออบเจ็กต์ SearchableInfo ที่แสดงถึง การกำหนดค่าที่ค้นหาได้

คุณขอรับข้อมูลอ้างอิงถึง SearchableInfo ได้โดยโทรไปที่ getSearchableInfo() ใน SearchManager

ตัวอย่างเช่น หากคุณใช้ SearchView เป็นมุมมองการดำเนินการใน แถบแอป ให้เปิดใช้วิดเจ็ตในระหว่าง onCreateOptionsMenu() Callback ดังที่แสดงในตัวอย่างต่อไปนี้

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the options menu from XML.
    val inflater = menuInflater
    inflater.inflate(R.menu.options_menu, menu)

    // Get the SearchView and set the searchable configuration.
    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    (menu.findItem(R.id.menu_search).actionView as SearchView).apply {
        // Assumes current activity is the searchable activity.
        setSearchableInfo(searchManager.getSearchableInfo(componentName))
        setIconifiedByDefault(false) // Don't iconify the widget. Expand it by default.
    }

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the options menu from XML.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Get the SearchView and set the searchable configuration.
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    // Assumes current activity is the searchable activity.
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // Don't iconify the widget. Expand it by default.

    return true;
}

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

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

ฟีเจอร์อื่นๆ ของวิดเจ็ต Search

SearchViewวิดเจ็ตมีฟีเจอร์เพิ่มเติมบางอย่างที่คุณอาจต้องการ ดังนี้

ปุ่มส่ง
โดยค่าเริ่มต้นจะไม่มีปุ่มส่งคำค้นหา ดังนั้นผู้ใช้จึงต้องกดปุ่ม Return บนแป้นพิมพ์เพื่อเริ่มการค้นหา คุณ เพิ่มปุ่ม "ส่ง" ได้โดยเรียกใช้ setSubmitButtonEnabled(true)
การปรับแต่งคำค้นหาสำหรับการแนะนำการค้นหา
เมื่อเปิดใช้คำแนะนำในการค้นหา คุณมักจะคาดหวังให้ผู้ใช้เลือกคำแนะนำ แต่ผู้ใช้อาจต้องการปรับแต่งคำค้นหาที่แนะนำด้วย คุณเพิ่มปุ่มข้างคำแนะนำแต่ละรายการได้ ซึ่งจะแทรกคำแนะนำ ในช่องค้นหาเพื่อให้ผู้ใช้ปรับแต่งได้โดยการเรียก setQueryRefinementEnabled(true)
ความสามารถในการเปิด/ปิดระดับการเข้าถึงช่องค้นหา
โดยค่าเริ่มต้น วิดเจ็ตค้นหาจะ "แปลงเป็นไอคอน" ซึ่งหมายความว่าวิดเจ็ตจะ แสดงด้วยไอคอนค้นหาเท่านั้น ซึ่งก็คือแว่นขยาย โดยจะขยายเพื่อ แสดงช่องค้นหาเมื่อผู้ใช้แตะไอคอน ดังที่แสดงในตัวอย่างก่อนหน้า คุณสามารถแสดงช่องค้นหาโดยค่าเริ่มต้นได้โดยการเรียก setIconifiedByDefault(false) นอกจากนี้ คุณยังสลับลักษณะวิดเจ็ตค้นหาได้โดยเรียกใช้ setIconified()

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

ใช้วิดเจ็ตและกล่องโต้ตอบ

หากคุณแทรกวิดเจ็ตค้นหาในแถบแอปเป็นมุมมองการดำเนินการและเปิดใช้ให้ปรากฏในแถบแอปหากมีพื้นที่ว่างโดยการตั้งค่า android:showAsAction="ifRoom" วิดเจ็ตค้นหาอาจไม่ปรากฏเป็นมุมมองการดำเนินการ แต่รายการในเมนูอาจปรากฏในเมนู ที่ซ่อนอยู่แทน เช่น เมื่อแอปทำงานบนหน้าจอขนาดเล็ก อาจมีพื้นที่ในแถบแอปไม่เพียงพอที่จะแสดงวิดเจ็ตค้นหาพร้อมกับรายการการดำเนินการอื่นๆ หรือองค์ประกอบการนำทาง ดังนั้นรายการเมนูจะปรากฏในเมนูที่ซ่อนอยู่แทน เมื่อวางไว้ในเมนูรายการเพิ่มเติม รายการจะทำงานเหมือนรายการเมนูทั่วไปและไม่แสดงมุมมองการดำเนินการ ซึ่งก็คือวิดเจ็ตค้นหา

หากต้องการจัดการสถานการณ์นี้ รายการเมนูที่คุณแนบวิดเจ็ตค้นหา ต้องเปิดใช้งานกล่องโต้ตอบการค้นหาเมื่อผู้ใช้เลือกจากเมนูแบบล้น หากต้องการให้เป็นเช่นนี้ ให้ใช้ onOptionsItemSelected() เพื่อจัดการรายการเมนู "ค้นหา" และเปิดกล่องโต้ตอบการค้นหาโดยเรียกใช้ onSearchRequested()

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของรายการในแถบแอปและวิธีจัดการ สถานการณ์นี้ได้ที่ เพิ่มแถบแอป

เพิ่มการค้นหาด้วยเสียง

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

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการดำเนินการนี้

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search_label"
    android:hint="@string/search_hint"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" >
</searchable>

ต้องระบุค่า showVoiceSearchButton เพื่อเปิดใช้การค้นหาด้วยเสียง ค่าที่ 2 launchRecognizer ระบุว่าปุ่มค้นหาด้วยเสียงต้องเปิดใช้ recognizer ที่แสดงผลข้อความที่ถอดเสียงไปยังกิจกรรมที่ค้นหาได้

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

เพิ่มคำแนะนำในการค้นหา

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

คุณระบุคำแนะนำในการค้นหาได้ 2 ประเภท ดังนี้

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