שאר התאימות לאחור

כדאי לנסות את התכונה 'כתיבה מהירה'
Jetpack Compose היא ערכת הכלים המומלצת לבניית ממשק משתמש ב-Android. איך מוסיפים פונקציית חיפוש בחלונית הכתיבה

הסמל SearchView וסרגל הפעולות זמינים רק ב-Android מגרסה 3.0 ואילך. כדי לתמוך בפלטפורמות ישנות יותר, אפשר להשתמש בתיבת הדו-שיח של החיפוש. תיבת הדו-שיח של החיפוש היא ממשק משתמש שמסופק על ידי המערכת, שמופיע בשכבה מעל האפליקציה כשמפעילים אותו.

הגדרת רמות API מינימלית ויעדים

כדי להגדיר את תיבת הדו-שיח של החיפוש, קודם צריך להצהיר במניפסט שאתם רוצים לתמוך במכשירים ישנים יותר, אבל לטרגט גרסאות Android 3.0 ואילך. כשעושים זאת, האפליקציה משתמשת באופן אוטומטי בסרגל הפעולות ב-Android מגרסה 3.0 ואילך, ובמערכת התפריטים המסורתית במכשירים ישנים יותר:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

<application>
...

הצגת תיבת הדו-שיח של החיפוש במכשירים ישנים יותר

כדי להפעיל את תיבת הדו-שיח של החיפוש במכשירים ישנים יותר, צריך להפעיל את onSearchRequested() בכל פעם שמשתמש בוחר באפשרות 'חיפוש' בתפריט האפשרויות. מאחר שבמכשירים עם Android מגרסה 3.0 ואילך מופיע הסמל SearchView בסרגל הפעולות (כפי שמוצג בשיעור הראשון), רק בגרסאות ישנות יותר מ-3.0 מתבצעת קריאה ל-onOptionsItemSelected() כשהמשתמש בוחר באפשרות בתפריט החיפוש.

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.search -> {
            onSearchRequested()
            true
        }
        else -> false
    }
}

Java

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.search:
            onSearchRequested();
            return true;
        default:
            return false;
    }
}

בדיקת גרסת ה-build של Android בזמן ריצה

בזמן הריצה, בודקים את גרסת המכשיר כדי לוודא שלא מתבצע שימוש לא נתמך ב-SearchView במכשירים ישנים יותר. בקוד לדוגמה, זה קורה ב-method‏ onCreateOptionsMenu():

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {

    menuInflater.inflate(R.menu.options_menu, menu)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
        (menu.findItem(R.id.search).actionView as SearchView).apply {
            setSearchableInfo(searchManager.getSearchableInfo(componentName))
            setIconifiedByDefault(false)
        }
    }
    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
    }
    return true;
}