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

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

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

הגדרת רמות API מינימליות ורמות API לטירגוט

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