เมื่อพร้อมที่จะเพิ่มฟังก์ชันการค้นหาลงในแอป 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>
ให้ดำเนินการดังนี้
- ประกาศกิจกรรมเพื่อยอมรับ Intent
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 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"
กิจกรรมที่ค้นหาได้จะได้รับ IntentACTION_SEARCH
ด้วยการโทรหาonNewIntent(Intent)
, การส่งผ่าน IntentACTION_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
![รูปภาพแสดงมุมมองการค้นหาในแถบด้านบนของแอป](https://developer.android.google.cn/static/images/ui/search-ui-topbar-33.png?authuser=19&hl=th)
รูปที่ 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 ประเภทดังนี้
- คำแนะนำการค้นหาล่าสุด
- คำแนะนำเหล่านี้เป็นคำที่ผู้ใช้เคยใช้ในการค้นหา คำค้นหาในแอปของคุณ ดูเพิ่ม การแนะนำการค้นหาที่กำหนดเองเพื่อดูข้อมูลเพิ่มเติม
- การแนะนำการค้นหาที่กำหนดเอง
- นี่คือการแนะนำการค้นหาที่คุณระบุจากแหล่งข้อมูลของคุณเองให้กับ ช่วยให้ผู้ใช้เลือกการสะกดหรือรายการที่ถูกต้องในทันที สำหรับ ดูเพิ่มการค้นหาที่กำหนดเอง คำแนะนำเพื่อดูข้อมูลเพิ่มเติม