التوافق السابق مع الأنظمة القديمة

لا يتوفّر كل من SearchView وشريط الإجراءات إلا على الإصدار 3.0 من نظام التشغيل Android والإصدارات الأحدث. لدعم الأنظمة الأساسية القديمة، يمكنك الرجوع إلى مربّع حوار البحث. مربّع حوار البحث هو واجهة مستخدم يوفّرها النظام ويتم عرضها فوق تطبيقك عند استدعائها.

تحديد الحد الأدنى والمستوى المستهدف لواجهة برمجة التطبيقات

لإعداد مربّع حوار البحث، عليك أولاً الإشارة في ملف البيان إلى أنّك تريد التوافق مع الأجهزة القديمة، ولكنّك تريد استهداف الإصدار 3.0 من نظام التشغيل Android أو الإصدارات الأحدث. عند إجراء ذلك، سيستخدم تطبيقك شريط الإجراءات تلقائيًا على الإصدار Android 3.0 أو الإصدارات الأحدث ويستخدم نظام القوائم التقليدي على الأجهزة القديمة:

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

<application>
...

توفير مربّع حوار البحث للأجهزة القديمة

لتفعيل مربّع حوار البحث على الأجهزة القديمة، يمكنك استدعاء الدالة onSearchRequested() عندما يختار المستخدم عنصر قائمة البحث من قائمة الخيارات. ولأنّ الأجهزة التي تعمل بالإصدار 3.0 من نظام التشغيل Android والإصدارات الأحدث تعرض 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 في وقت التشغيل

ويمكنك التحقّق من إصدار الجهاز في وقت التشغيل للتأكّد من عدم استخدام 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;
}