سازگار با عقب ماندن

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() را صدا می‌کنند.

کاتلین

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

جاوا

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

نسخه ساخت اندروید را در زمان اجرا بررسی کنید

در زمان اجرا، نسخه دستگاه را بررسی کنید تا مطمئن شوید استفاده پشتیبانی نشده از SearchView در دستگاه‌های قدیمی‌تر رخ نمی‌دهد. در کد مثال ما، این در متد onCreateOptionsMenu() اتفاق می افتد:

کاتلین

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
}

جاوا

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