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

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;
    }
}

איך בודקים את גרסת Android Build בזמן הריצה

בזמן הריצה, צריך לבדוק את גרסת המכשיר כדי לוודא שלא קיים שימוש לא נתמך ב-SearchView במכשירים ישנים. בקוד לדוגמה שלנו, זה קורה השיטה 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;
}