הלחצן 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; }