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