מומלץ להשתמש
SearchView
כפריט בסרגל האפליקציות, שמספק פונקציונליות חיפוש באפליקציה. בתור
עם כל הפריטים בסרגל האפליקציה, אפשר להגדיר את SearchView
כדי
מוצגות כל הזמן או רק כשיש מקום. אפשר גם להגדיר אותו
פעולה הניתנת לכיווץ, שמציגה את SearchView
כסמל
בהתחלה, ואז יוצג כל סרגל האפליקציה כשדה חיפוש כשהמשתמש
מקישים על הסמל.
הוספת SearchView לסרגל האפליקציות
כדי להוסיף ווידג'ט של SearchView
לסרגל האפליקציות, צריך ליצור קובץ
לפרויקט בשם res/menu/options_menu.xml
ולהוסיף את הקוד הבא
לקובץ. הקוד הזה מגדיר איך ליצור את הפריט לחיפוש, כמו הסמל
לשימוש ואת שם הפריט. המאפיין collapseActionView
מאפשרת ל-SearchView
להתרחב כך שהיא תכסה את כל סרגל האפליקציות
מתכווצים חזרה לפריט רגיל בסרגל האפליקציה כשלא בשימוש. בגלל
שטח מוגבל בסרגל האפליקציות במכשירים ניידים, מומלץ להשתמש
מאפיין collapsibleActionView
כדי לספק משתמש טוב יותר
חוויה אישית.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/ic_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="androidx.appcompat.widget.SearchView" /> </menu>
אם רוצים סמל חיפוש נגיש יותר, יוצרים
קובץ אחד (ic_search.xml
) בתיקייה /res/drawable
ו
כוללים את הקוד הבא:
<vector android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/> </vector>
כדי להציג את SearchView
בסרגל האפליקציות, צריך להגדיל את תפריט ה-XML
במשאב res/menu/options_menu.xml
onCreateOptionsMenu()
שיטת הפעילות שלך:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) return true }
הרצת האפליקציה יוצרת בערך כך:
SearchView
מופיע בסרגל האפליקציות של האפליקציה, אבל הוא לא מופיע
פונקציונליות. אם מקישים על סמל החיפוש, מקבלים משהו כזה:
כדי שהפונקציה SearchView
תוכל לפעול, עליך להגדיר איך
SearchView
פועל/ת.
יצירת הגדרות חיפוש
חיפוש
מציין איך SearchView
מתנהג
מוגדר בקובץ res/xml/searchable.xml
. הגדרות חיפוש
חייב להכיל, לכל הפחות, מאפיין android:label
שכולל את
זהה לערך המאפיין android:label
של
<application>
או <activity>
במניפסט של Android. עם זאת, מומלץ גם להוסיף
מאפיין android:hint
כדי לתת למשתמשים מושג מה צריך להזין
בתיבת החיפוש.
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" />
בקובץ המניפסט של האפליקציה, צריך להצהיר על
<meta-data>
שמפנה לקובץ res/xml/searchable.xml
. להצהיר על
ב-<activity>
שבו רוצים להציג את
SearchView
.
<activity android:name=".SearchResultsActivity" android:exported="false" android:label="@string/title_activity_search_results" android:launchMode="singleTop" android:theme="@style/Theme.AppCompat.Light"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity>
משייכים באמצעות method onCreateOptionsMenu()
שיוצרים
את תצורת החיפוש עם SearchView
באמצעות
setSearchableInfo(SearchableInfo)
:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager val searchView = menu.findItem(R.id.search).actionView as SearchView val component = ComponentName(this, SearchResultsActivity::class.java) val searchableInfo = searchManager.getSearchableInfo(component) searchView.setSearchableInfo(searchableInfo) return true }
הקריאה אל
getSearchableInfo()
מקבל
SearchableInfo
שנוצר באמצעות קובץ ה-XML של הגדרות החיפוש. כשהחיפוש
משויך בצורה נכונה אל SearchView
משתמש שולח שאילתה, SearchView
מתחיל פעילות עם
ACTION_SEARCH
בכוונה טובה. לאחר מכן צריך פעילות שיכולה לסנן לפי הכוונה הזו ולטפל
שאילתת החיפוש.
יצירת פעילות שניתן לחפש
מסנן פעילות שניתן לחפש לפי Intent ו-ACTION_SEARCH
מחפש את השאילתה בקבוצת נתונים. כדי ליצור פעילות שאפשר לחפש, צריך להצהיר על
פעילות שבחרת לסנן עבור ACTION_SEARCH
Intent:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
בפעילות הניתנת לחיפוש, צריך לטפל בכוונה ACTION_SEARCH
באמצעות
בבדיקה
onCreate()
.
Kotlin
class SearchResultsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_search_results) handleIntent(intent) } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { if (Intent.ACTION_SEARCH == intent.action) { val query = intent.getStringExtra(SearchManager.QUERY) Log.d("SEARCH", "Search query was: $query") } } }
עכשיו SearchView
יכול לקבל את השאילתה של המשתמש ולהתחיל
פעילות הניתנת לחיפוש עם הכוונה ACTION_SEARCH
.
אחרי שתקבלו את שאילתת החיפוש, תוכלו להעביר אותה
ViewModel
, שבו אפשר להשתמש בו בשכבות אחרות של
לאחזור תוצאות החיפוש להצגה.