הגדרת ממשק החיפוש

מומלץ להשתמש 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
}

הרצת האפליקציה יוצרת בערך כך:

תמונה שמוצג בה מסך ריק עם סמל חיפוש בסרגל העליון של האפליקציה
איור 1. סמל חיפוש בסרגל העליון של האפליקציה.

SearchView מופיע בסרגל האפליקציות של האפליקציה, אבל הוא לא מופיע פונקציונליות. אם מקישים על סמל החיפוש, מקבלים משהו כזה:

תמונה שמראה את תצוגת החיפוש בפעולה
איור 2. 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, שבו אפשר להשתמש בו בשכבות אחרות של לאחזור תוצאות החיפוש להצגה.