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

روش نوشتن را امتحان کنید
Jetpack Compose ابزار رابط کاربری پیشنهادی برای اندروید است. یاد بگیرید که چگونه قابلیت جستجو را در Compose اضافه کنید.

SearchView و نوار اکشن فقط در اندروید ۳.۰ و بالاتر در دسترس هستند. برای پشتیبانی از پلتفرم‌های قدیمی‌تر، می‌توانید به کادر محاوره‌ای جستجو برگردید. کادر محاوره‌ای جستجو یک رابط کاربری ارائه شده توسط سیستم است که هنگام فراخوانی، روی برنامه شما قرار می‌گیرد.

تنظیم حداقل و حداکثر سطح API

برای تنظیم کادر محاوره‌ای جستجو، ابتدا در مانیفست خود اعلام کنید که می‌خواهید از دستگاه‌های قدیمی‌تر پشتیبانی کنید، اما می‌خواهید نسخه‌های اندروید ۳.۰ یا بالاتر را هدف قرار دهید. وقتی این کار را انجام می‌دهید، برنامه شما به طور خودکار از نوار اکشن در اندروید ۳.۰ یا بالاتر و از سیستم منوی سنتی در دستگاه‌های قدیمی‌تر استفاده می‌کند:

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

<application>
...

کادر جستجوی دستگاه‌های قدیمی‌تر را فعال کنید

برای فراخوانی کادر محاوره‌ای جستجو در دستگاه‌های قدیمی‌تر، هر زمان که کاربر آیتم منوی جستجو را از منوی گزینه‌ها انتخاب می‌کند، تابع onSearchRequested() را فراخوانی کنید. از آنجا که دستگاه‌های اندروید ۳.۰ و بالاتر، SearchView در نوار عمل نشان می‌دهند (همانطور که در درس اول نشان داده شد)، فقط نسخه‌های قدیمی‌تر از ۳.۰، تابع 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;
}