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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ไฟล์การกำหนดค่าการค้นหาต้องมีแอตทริบิวต์ <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" >
</searchable>

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

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

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

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

กิจกรรมที่ค้นหาได้คือ Activity ในแอปของคุณที่มีประสิทธิภาพ ค้นหาตามสตริงการค้นหาและแสดงผลการค้นหา

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

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

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

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

  1. ประกาศกิจกรรมเพื่อยอมรับ Intent 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 Intent นี้มีคำค้นหาในสตริง QUERY เพิ่มเติม ตรวจสอบ 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 Intent ในตัวอย่างก่อนหน้านี้ คำค้นหาคือ ดึงข้อมูลและส่งไปยังเมธอด doMySearch() ในเครื่องที่เมธอด ค้นหาจริงๆ แล้ว

ค้นหาข้อมูล

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

  • หากข้อมูลจัดเก็บอยู่ในฐานข้อมูล SQLite บนอุปกรณ์ การดำเนินการ การค้นหาข้อความแบบเต็มโดยใช้ FTS3 แทน LIKE สามารถให้การค้นหาที่มีประสิทธิภาพมากขึ้นในข้อมูลแบบข้อความ และสามารถ ให้ผลลัพธ์เร็วขึ้นมาก โปรดดู sqlite.org สำหรับ ข้อมูลเกี่ยวกับ FTS3 และ SQLiteDatabase สำหรับข้อมูลเกี่ยวกับ SQLite บน Android
  • หากข้อมูลของคุณจัดเก็บแบบออนไลน์ ประสิทธิภาพในการค้นหาที่รับรู้อาจ ถูกขัดขวางโดยการเชื่อมต่อข้อมูลของผู้ใช้ คุณอาจต้องการแสดง สัญญาณบอกสถานะความคืบหน้าจนกว่าการค้นหาจะกลับมา โปรดดู 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() วิธี เมื่อระบบเรียกใช้เมธอดนี้ ระบบจะ เป็นตัวบ่งชี้ว่ากิจกรรมของคุณสูญเสียโฟกัสการป้อนข้อมูลไปยังกล่องโต้ตอบการค้นหา ดังนั้น คุณก็ทำงานใดก็ตามที่เหมาะกับกิจกรรมนั้น เช่น การหยุดเกมชั่วคราว ยกเว้น คุณกำลังส่งบริบทการค้นหา ข้อมูล ที่หารือในส่วนอื่นของเอกสารนี้ ให้จบการดำเนินการ โดยการเรียกใช้การใช้งาน Superclass

Kotlin

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

Java

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

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

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

  • โดยค่าเริ่มต้น กิจกรรมที่ค้นหาได้จะได้รับ ACTION_SEARCH Intent การโทรไปยัง onCreate() และกิจกรรมใหม่จะปรากฏที่ด้านบนสุดของกิจกรรม สแต็ก ขณะนี้จะมี 2 อินสแตนซ์ของกิจกรรมที่คุณค้นหาได้ใน กลุ่มกิจกรรม ดังนั้นการแตะปุ่มย้อนกลับจะนำคุณกลับไปยัง ของกิจกรรมที่ค้นหาได้ แทนที่จะออกจากหน้า กิจกรรม
  • หากคุณตั้งค่า android:launchMode เป็น "singleTop" กิจกรรมที่ค้นหาได้จะได้รับ Intent ACTION_SEARCH ด้วยการโทรหา onNewIntent(Intent), การส่งผ่าน 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;
 }

การส่งคืนค่า "จริง" แสดงให้ทราบว่าคุณจัดการเหตุการณ์ Callback นี้ได้สำเร็จและ โทรหา 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);
}

ใช้วิดเจ็ต Search

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

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

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

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

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

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

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

วิดเจ็ต SearchView มีฟีเจอร์เพิ่มเติมให้คุณ อาจจะต้อง:

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

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

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

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

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

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

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

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

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

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