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

ننصح باستخدام 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، حيث يمكنك استخدامه في طبقات أخرى من البنية الأساسية لاسترداد نتائج البحث لعرضها.