إعداد واجهة البحث

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

إضافة ميزة SearchView إلى شريط التطبيق

لإضافة تطبيق SearchView المصغّر إلى شريط التطبيقات، أنشئ ملفًا في مشروعك باسم res/menu/options_menu.xml وأضِف الرمز التالي إلى الملف. تحدد هذه التعليمة البرمجية كيفية إنشاء عنصر البحث، مثل الأيقونة التي يجب استخدامها وعنوان العنصر. collapseActionView تتيح لك السمة SearchView التوسيع لتشغل شريط التطبيقات بأكمله وتصغيرها مرة أخرى إلى عنصر شريط تطبيق عادي عند عدم استخدامها. بسبب مساحة شريط التطبيق المحدودة على أجهزة الهواتف، ننصح باستخدام السمة collapsibleActionView لتوفير تجربة أفضل للمستخدم.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
        android:title="@string/search_title"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>

إذا أردت رمز بحث يمكن الوصول إليه بسهولة، أنشِئ ملف ic_search.xml في مجلد /res/drawable وضمِّن الرمز التالي فيه:

<vector
    android:height="24dp"
    android:tint="#000000"
    android:viewportHeight="24"
    android:viewportWidth="24"
    android:width="24dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

لعرض SearchView في شريط التطبيقات، يمكنك تضخيم مورد قائمة XML res/menu/options_menu.xml في طريقة onCreateOptionsMenu() الخاصة بنشاطك:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    return true
}

يؤدي تشغيل التطبيق إلى إنشاء شيء مثل ما يلي:

صورة تعرض شاشة فارغة مع رمز بحث في الشريط العلوي للتطبيق
الشكل 1. رمز البحث في الشريط العلوي للتطبيق

يظهر رمز SearchView في شريط التطبيقات في التطبيق، ولكنه لا يعمل. إذا نقرت على رمز البحث، سيظهر لك ما يلي:

صورة تعرض طريقة عرض البحث أثناء تنفيذها
الشكل 2. SearchView قيد التشغيل.

لاستخدام السمة SearchView، يجب تحديد طريقة عمل SearchView.

إنشاء إعدادات بحث

تحدِّد إعدادات البحث طريقة عمل SearchView وتحديدها في ملف res/xml/searchable.xml. يجب أن تحتوي إعدادات البحث على الأقل على سمة android:label لها القيمة نفسها للسمة android:label للعنصر <application> أو <activity> في بيان Android. مع ذلك، ننصح أيضًا بإضافة السمة android:hint لمنح المستخدم فكرة عما يجب إدخاله في مربّع البحث.

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint" />

في ملف البيان الخاص بتطبيقك، حدِّد عنصر <meta-data> يشير إلى ملف res/xml/searchable.xml. حدِّد العنصر في <activity> الذي تريد عرض SearchView فيه.

<activity
android:name=".SearchResultsActivity"
android:exported="false"
android:label="@string/title_activity_search_results"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

في طريقة onCreateOptionsMenu() التي تنشئها، اربط إعدادات البحث بـ SearchView من خلال استدعاء setSearchableInfo(SearchableInfo):

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView = menu.findItem(R.id.search).actionView as SearchView
    val component = ComponentName(this, SearchResultsActivity::class.java)
    val searchableInfo = searchManager.getSearchableInfo(component)
    searchView.setSearchableInfo(searchableInfo)
    return true
}

عند الاستدعاء إلى getSearchableInfo() يمكن الحصول على كائن SearchableInfo الذي يتم إنشاؤه من ملف XML الخاص بإعداد البحث. عند ربط إعدادات البحث بشكل صحيح مع SearchView ويرسل المستخدم طلب بحث، تبدأ SearchView نشاطًا بقصد ACTION_SEARCH. بعد ذلك، تحتاج إلى نشاط يمكنه الفلترة لعرض هذا الغرض والتعامل مع طلب البحث.

إنشاء نشاط قابل للبحث

يتيح لك النشاط القابل للبحث إمكانية البحث عن الغرض من ACTION_SEARCH والبحث عن طلب البحث في مجموعة بيانات. لإنشاء نشاط يمكن البحث فيه، يجب تحديد نشاط من اختيارك للفلترة حسب هدف ACTION_SEARCH:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

في نشاطك القابل للبحث، تعامل مع هدف ACTION_SEARCH من خلال البحث عنه في طريقة onCreate().

Kotlin

class SearchResultsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search_results)
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            val query = intent.getStringExtra(SearchManager.QUERY)
            Log.d("SEARCH", "Search query was: $query")
        }
    }
}

يمكن لـ SearchView قبول طلب بحث المستخدم وبدء نشاطك القابل للبحث بقصد ACTION_SEARCH.

بعد الحصول على طلب البحث، يمكنك تمريره إلى ViewModel، حيث يمكنك استخدامه في طبقات أخرى من البنية الأساسية لاسترداد نتائج البحث لعرضها.