إنشاء واجهة بحث

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

تشمل الميزات الأخرى المتاحة لمربّع حوار البحث والأداة ما يلي:

  • البحث الصوتي
  • اقتراحات البحث استنادًا إلى طلبات البحث الأخيرة
  • اقتراحات البحث التي تتطابق مع النتائج الفعلية في بيانات تطبيقك

يعرض هذا المستند كيفية إعداد تطبيقك لتوفير واجهة بحث. يدعمه نظام Android لتقديم طلبات البحث، باستخدام مربّع حوار البحث أو أداة البحث

مراجع ذات صلة:

الأساسيات

قبل البدء، حدد ما إذا كنت تريد تنفيذ واجهة البحث باستخدام مربّع حوار البحث أو تطبيق "بحث Google" المصغّر وهما يقدمون نتائج البحث نفسها ولكن بطرق مختلفة قليلاً:

  • مربع حوار البحث هو مكون واجهة مستخدم يتم التحكم فيه من خلال نظام Android. عندما يقوم المستخدم بتنشيطه، يظهر مربع حوار البحث على الجزء العلوي من النشاط.

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

  • أداة البحث هي مثال على SearchView التي يمكنك وضعها في أي مكان في التخطيط لديك. تعمل أداة "بحث Google" تلقائيًا عادي EditText ولا يفعل أي شيء، ولكن يمكنك إعداده بحيث إلى معالجة جميع أحداث الإدخال، ويسلم طلبات البحث إلى نشاطك، وتوفر اقتراحات بحث—تمامًا مثل عبارات البحث .

عندما يُجري المستخدم عملية بحث من مربّع حوار البحث أو من أداة بحث، ينشئ النظام Intent و بتخزين استعلام المستخدم فيه. يبدأ النظام بعد ذلك النشاط الإفصاح عن التعامل مع عمليات البحث—"النشاط القابل للبحث"—وتقديمه النية. لإعداد تطبيقك لهذا النوع من البحث المدعوم، تحتاج إلى التالي:

  • تهيئة بحث
    ملف XML يضبط بعض الإعدادات لمربّع حوار البحث أو أداة البحث فهي تتضمن إعدادات لميزات مثل البحث الصوتي واقتراح البحث بالإضافة إلى نص تلميح لمربّع البحث
  • نشاط يمكن البحث فيه
    Activity يتلقّى طلب البحث، ويبحث في بياناتك، ويعرض عبارات البحث نتائجك.
  • واجهة بحث، يتم توفيرها من خلال أي مما يلي:
    • مربع حوار البحث
      يكون مربع حوار البحث مخفيًا تلقائيًا. وتظهر في الجزء العلوي من الشاشة عند إجراء اتصال onSearchRequested() عندما ينقر المستخدم على الزر بحث.
    • SearchView تطبيق مصغّر
      يتيح لك استخدام تطبيق "بحث Google" المصغّر وضع مربّع البحث في أي مكان في نشاطك، بما في ذلك عرض الإجراء في شريط التطبيقات.

توضّح لك بقية هذا المستند كيفية إنشاء إعدادات البحث. ونشاط قابل للبحث وكيفية تنفيذ واجهة بحث باستخدام مربّع حوار البحث أو تطبيق "بحث Google" المصغّر

إنشاء تهيئة قابلة للبحث

أول شيء تحتاجه هو ملف XML يسمى إعدادات البحث. فهي تهيئ جوانب معينة لواجهة المستخدم لمربع حوار أو أداة البحث وتحدد كيفية ميزات مثل الاقتراحات والبحث الصوتي. عادةً ما يكون هذا الملف يُسمى searchable.xml ويجب حفظه في res/xml/ دليل المشروع.

يجب أن يتضمن ملف تهيئة البحث <searchable> كعقدة جذرية وتحديد سمة واحدة أو أكثر، كما هو موضح في المثال التالي:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint" >
</searchable>

السمة android:label هي السمة الوحيدة المطلوبة. أُنشأها جون هنتر، الذي كان متخصصًا يشير إلى مورد سلسلة، والذي يجب أن يكون اسم التطبيق. هذا التصنيف ليس مرئية للمستخدم حتى يتم تفعيل اقتراحات البحث لمربع البحث السريع، على نقطة ظهور التصنيف في قائمة العناصر القابلة للبحث في النظام الإعدادات.

على الرغم من أنّ هذا الإجراء ليس مطلوبًا، ننصحك بتضمين السمة android:hint التي توفّر سلسلة تلميح في عملية البحث قبل أن يُدخل المستخدمون استعلامًا. التلميح مهم لأنه يوفر إشارات مهمة للمستخدمين حول ما يمكنهم البحث فيه.

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

إنشاء نشاط يمكن البحث فيه

النشاط القابل للبحث هو Activity الذي يحقِّق أداءً جيدًا في تطبيقك. عمليات البحث بناءً على سلسلة طلب بحث وتعرض نتائج البحث.

عندما يجري المستخدم عملية بحث في مربّع حوار البحث أو أداة البحث، يلجأ النظام يبدأ نشاطك القابل للبحث ويقدم له طلب البحث في Intent مع ACTION_SEARCH اتخاذ القرار. يسترجع نشاطك القابل للبحث طلب البحث من عناصر QUERY إضافية، ثم تبحث في بياناتك وتعرض النتائج.

يمكنك تضمين مربّع حوار البحث أو تطبيق مصغّر في أي نشاط آخر في في تطبيقك، يجب أن يعرف النظام أي نشاط يمثل نشاطك القابل للبحث يمكنه تقديم طلب البحث بشكل صحيح. لذا، أعلن أولاً عن تطبيقك القابل للبحث النشاط في ملف بيان Android.

إعلان نشاط يمكن البحث فيه

أنشئ Activity إذا لم يكن لديك حساب حالي. البحث ويعرض النتائج. لست بحاجة إلى تنفيذ البحث ما عليك سوى إنشاء نشاط يمكنك الإفصاح عنه في البيان. داخل البيان <activity> قم بما يلي:

  1. يُرجى تعريف النشاط لقبول هدف "ACTION_SEARCH" في <intent-filter> العنصر.
  2. تحديد تهيئة البحث المراد استخدامها في <meta-data> العنصر.

يظهر ذلك في المثال التالي:

<application ... >
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>
    ...
</application>

يجب أن يتضمّن العنصر <meta-data> السمة سمة android:name بقيمة "android.app.searchable" وandroid:resource ذات مرجع إلى ملف التهيئة القابل للبحث. في جلسة المعمل، المثال السابق، يشير إلى سمة res/xml/searchable.xml الملف.

إجراء بحث

بعد الإعلان عن نشاطك القابل للبحث في البيان، يُرجى اتّباع الخطوات التالية: الإجراء اللازم لإجراء بحث في نشاطك القابل للبحث:

  1. احصل على طلب البحث.
  2. البحث في بياناتك:
  3. اعرض النتائج.

تلقّي الطلب

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

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.search)

    // Verify the action and get the query.
    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            doMySearch(query)
        }
    }
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);

    // Get the intent, verify the action, and get the query.
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
}

يتم دائمًا تضمين السلسلة QUERY مع هدف واحد (ACTION_SEARCH). في المثال السابق، الاستعلام ويتم استردادها وتمريرها إلى طريقة doMySearch() محلية حيث إتمام عملية البحث الفعلية.

البحث في بياناتك

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

  • إذا تم تخزين بياناتك في قاعدة بيانات SQLite على الجهاز، فسيؤدي إجراء البحث في النص الكامل: باستخدام FTS3، بدلاً من LIKE طلب بحث - يمكن أن يوفر بحثًا أكثر فعالية عبر البيانات النصية ويمكن تؤدي إلى النتائج بشكل أسرع بكثير. عرض sqlite.org لـ معلومات حول FTS3 SQLiteDatabase للحصول على معلومات حول SQLite على Android.
  • إذا تم تخزين بياناتك على الإنترنت، قد يتأثر أداء البحث من خلال اتصال بيانات المستخدم. قد ترغب في عرض مؤشر التقدم إلى أن يعود بحثك. عرض android.net كمرجع لواجهات برمجة تطبيقات الشبكة ProgressBar للحصول على معلومات حول كيفية عرض مؤشر التقدّم

اعرض النتائج

بغض النظر عن مكان وجود البيانات وكيفية البحث عنها، نوصي بما يلي: يؤدي إلى إرجاع نتائج البحث إلى نشاطك القابل للبحث Adapter هذا النمط طريقة، يمكنك تقديم جميع نتائج البحث في RecyclerView إذا كانت بياناتك تأتي من استعلام قاعدة بيانات SQLite، فيمكنك تطبيق نتائجك على RecyclerView باستخدام CursorAdapter إذا كانت بياناتك تأتي بتنسيق مختلف، فيمكنك إنشاء امتداد BaseAdapter

تربط Adapter كل عنصر من مجموعة بيانات في كائن View. فعندما يتم تطبيق Adapter على RecyclerView، على أن يكون كل جزء من البيانات يتم إدراجها كعرض فردي في القائمة. Adapter هو مجرد واجهة، وبالتالي فإن عمليات التنفيذ مثل CursorAdapter: لربط البيانات من Cursor—هي احتاجت. إذا لم تنجح أي من عمليات التنفيذ الحالية في معالجة بياناتك، يمكنك تنفيذ نصك الخاص من BaseAdapter.

استخدام مربّع حوار البحث

يوفر مربع حوار البحث مربع بحث عائم أعلى الشاشة، مع أيقونة التطبيق على اليسار. يمكن لمربّع حوار البحث تقديم اقتراحات البحث. مع كتابة المستخدم. عندما ينفذ المستخدم عملية بحث، يرسل النظام عملية البحث طلب بحث إلى نشاط قابل للبحث يجري عملية البحث.

يكون مربّع حوار البحث مخفيًا بشكل تلقائي إلى أن يفعّله المستخدم. يمكن للتطبيق تفعيل مربّع حوار البحث من خلال الاتصال onSearchRequested() ومع ذلك، لن تعمل هذه الطريقة حتى لتفعيل مربع حوار البحث للنشاط.

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

للإعلان عن النشاط القابل للبحث في مربّع حوار البحث لأحد الأنشطة، أضِف عنصر <meta-data> داخل النشاط ذي الصلة العنصر <activity> <meta-data> على السمة android:value التي تحدّد اسم فئة النشاط القابل للبحث والسمة android:name بالقيمة "android.app.default_searchable".

على سبيل المثال، فيما يلي الإعلان الخاص بكل من نشاط يمكن البحث فيه، SearchableActivity ونشاط آخر، OtherActivity، التي تستخدم SearchableActivity من أجل إجراء عمليات بحث تم تنفيذها من مربع حوار البحث:

<application ... >
    <!-- This is the searchable activity; it performs searches. -->
    <activity android:name=".SearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>

    <!-- This activity enables the search dialog to initiate searches
         in the SearchableActivity. -->
    <activity android:name=".OtherActivity" ... >
        <!-- Enable the search dialog to send searches to SearchableActivity. -->
        <meta-data android:name="android.app.default_searchable"
                   android:value=".SearchableActivity" />
    </activity>
    ...
</application>

لأنّ السمة OtherActivity أصبحت تتضمّن الآن <meta-data> للإعلان عن النشاط القابل للبحث الذي يجب البحث عنه استخدامه لعمليات البحث، يمكّن النشاط مربع حوار البحث. وعلى الرغم من أن المستخدم في هذا النشاط، تفعِّل الطريقة onSearchRequested() مربع حوار البحث. عندما ينفذ المستخدم البحث، يبدأ النظام SearchableActivity وتسليمه إلى ACTION_SEARCH والنية.

إذا أردت أن يوفر كل نشاط في تطبيقك مربع حوار البحث، فأدرج عنصر <meta-data> السابق كعنصر ثانوي <application> بدلاً من كل عنصر <activity>. بهذه الطريقة، يصبح كل نشاط لكي يكتسب القيمة ويوفر مربع حوار البحث، ويسلم عمليات البحث إلى نفس النشاط القابل للبحث. إذا كان لديك العديد من الأنشطة القابلة للبحث، يمكنك تجاوز النشاط الافتراضي للبحث من خلال وضع بيان "<meta-data>" داخل الأنشطة الفردية.

بعد تفعيل مربّع حوار البحث للأنشطة، أصبح تطبيقك جاهزًا إجراء عمليات البحث.

استدعاء مربّع حوار البحث

وعلى الرغم من أن بعض الأجهزة توفر زر بحث مخصصًا، فإن سلوك قد يختلف الزر بين جهازين، ولا تتيح العديد من الأجهزة إجراء بحث على الإطلاق. لذا، عند استخدام مربّع حوار البحث، يجب توفير زر بحث في واجهة المستخدم التي تفعِّل مربّع حوار البحث من خلال استدعاء onSearchRequested()

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

يمكنك أيضًا تفعيل ميزة "النوع للبحث" وظيفة تنشّط مربّع حوار البحث عندما يبدأ المستخدم في الكتابة على لوحة المفاتيح تُعد ضغطات المفاتيح عن طريق الخطأ في مربع حوار البحث. يمكنك تفعيل ميزة "البحث بالكتابة" في نشاطك. من خلال إجراء مكالمة setDefaultKeyMode—أو DEFAULT_KEYS_SEARCH_LOCAL — خلال نشاطك onCreate() .

تأثير مربّع حوار البحث في دورة حياة نشاطك

مربع حوار البحث هو Dialog عائم في الجزء العلوي من الشاشة. ولا تتسبب في أي تغيير في حزمة الأنشطة، لذا عند ظهور مربع حوار البحث، لن تظهر أي طرق لمراحل النشاط، مثل onPause()—هي استدعيت. يفقد نشاطك التركيز على الإدخال، لأنّ هذا التركيز يعود إلى مربع حوار البحث.

إذا أردت أن يتم إبلاغك عند تفعيل مربع حوار البحث، يمكنك إلغاء طريقة onSearchRequested(). وعندما يستدعي النظام هذه الطريقة، هو إشارة إلى أن نشاطك يفقد تركيز الإدخال في مربع حوار البحث، لذا يمكنك اتخاذ أي إجراء مناسب للحدث، مثل إيقاف اللعبة مؤقتًا. إلا يتمّ تمرير سياق البحث البيانات—التي تمت مناقشتها في قسم آخر من هذا المستند، أنهِ من خلال استدعاء التنفيذ الفائق وهو:

Kotlin

override fun onSearchRequested(): Boolean {
    pauseSomeStuff()
    return super.onSearchRequested()
}

Java

@Override
public boolean onSearchRequested() {
    pauseSomeStuff();
    return super.onSearchRequested();
}

إذا ألغى المستخدم البحث بالنقر على الزر "رجوع"، ويستعيد النشاط التركيز المدخل. يمكنك التسجيل لتلقّي إشعارات عند إغلاق مربع حوار البحث باستخدام setOnDismissListener(), setOnCancelListener(), أو كليهما. ما عليك سوى تسجيل OnDismissListener, لأنه يتم استدعاؤه في كل مرة يتم فيها إغلاق مربع حوار البحث. تشير رسالة الأشكال البيانية OnCancelListener ترتبط فقط بالأحداث التي يخرج فيها المستخدم صراحةً من مربع حوار البحث، لا يتم استدعاؤه عند تنفيذ عملية بحث. عند تنفيذ البحث، ويختفي مربع حوار البحث تلقائيًا.

إذا لم يكن النشاط الحالي هو النشاط القابل للبحث، فعندئذٍ تكون الحالة يتم بدء أحداث مراحل نشاط النشاط عندما يُنفِّذ المستخدم بحث - يتلقى النشاط الحالي onPause()، على النحو الموصوف في مقدمة إلى . ومع ذلك، إذا كان النشاط الحالي هو النشاط القابل للبحث، ثم يحدث أحد الأمرين:

  • بشكل افتراضي، يتلقى النشاط القابل للبحث "ACTION_SEARCH" بحاجة إلى مكالمة إلى "onCreate()". ويتم وضع مثيل جديد للنشاط في أعلى النشاط حزمة. توجد الآن حالتان من نشاطك القابل للبحث في الأنشطة، لذا فإن النقر على زر الرجوع يعيدك إلى مثيل للنشاط القابل للبحث، بدلاً من الخروج من ملف الأخرى.
  • إذا ضبطت android:launchMode على "singleTop"، عندئذٍ يتلقى النشاط القابل للبحث الهدف ACTION_SEARCH بإجراء مكالمة إلى onNewIntent(Intent), تمرير هدف ACTION_SEARCH الجديد. على سبيل المثال، إليك كيفية قد تتعامل مع هذه الحالة، وفيها يكون وضع إطلاق النشاط القابل للبحث "singleTop":

    Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.search)
        handleIntent(intent)
    }
    
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        handleIntent(intent)
    }
    
    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            intent.getStringExtra(SearchManager.QUERY)?.also { query ->
                doMySearch(query)
            }
        }
    }

    Java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);
        handleIntent(getIntent());
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        handleIntent(intent);
    }
    
    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
          String query = intent.getStringExtra(SearchManager.QUERY);
          doMySearch(query);
        }
    }

    بالمقارنة مع مثال التعليمة البرمجية في القسم حول إجراء بحث، وكل التعليمات البرمجية للتعامل مع أصبح القصد من البحث الآن في طريقة handleIntent()، لكي يكون كلاهما يمكن لكل من onCreate() وonNewIntent() تنفيذه.

    عندما يتصل النظام بـ onNewIntent(Intent)، لا يتم إجراء النشاط. إعادة تشغيل، وبالتالي getIntent() تُرجع نفس الغرض الذي تم استلامه باستخدام onCreate(). هذا هو السبب في أنه يجب عليك الاتصال setIntent(Intent) داخل onNewIntent(Intent): بحيث يتم حفظ النية يتم تعديل نشاطك في حال الاتصال بـ getIntent() في المستقبل.

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

<activity android:name=".SearchableActivity"
          android:launchMode="singleTop" >
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
          android:name="android.app.searchable"
          android:resource="@xml/searchable"/>
  </activity>

تمرير بيانات سياق البحث

في بعض الحالات، يمكنك إجراء التحسينات اللازمة لطلب البحث داخل النشاط القابل للبحث لكل عملية بحث يتم إجراؤها. ومع ذلك، إذا كنت تريد تحسين معايير البحث استنادًا إلى النشاط الذي يتم من خلاله المستخدم إجراء البحث، يمكنك تقديم بيانات إضافية في الغرض الذي يرسله النظام إلى نشاطك القابل للبحث. يمكنك تمرير البيانات الإضافية في APP_DATA Bundle، وهو مضمّنة في هدف ACTION_SEARCH.

لتمرير هذا النوع من البيانات إلى نشاطك القابل للبحث، تجاوز طريقة onSearchRequested() للنشاط الذي يمكن للمستخدم من خلاله إجراء بحث وإنشاء Bundle باستخدام البيانات الإضافية مكالمة startSearch() لتنشيط مربع حوار البحث. مثلاً:

Kotlin

override fun onSearchRequested(): Boolean {
    val appData = Bundle().apply {
        putBoolean(JARGON, true)
    }
    startSearch(null, false, appData, false)
    return true
}

Java

@Override
public boolean onSearchRequested() {
     Bundle appData = new Bundle();
     appData.putBoolean(SearchableActivity.JARGON, true);
     startSearch(null, false, appData, false);
     return true;
 }

يشير إرجاع القيمة "صحيح" إلى نجاحك في التعامل مع حدث معاودة الاتصال هذا يمكنك الاتصال بـ startSearch() لتفعيل مربّع حوار البحث. بعد أن يبدأ المستخدم يرسل طلب بحث، ويتم تسليمه إلى نشاطك القابل للبحث مع البيانات التي تضيفها. يمكنك استخراج البيانات الإضافية من APP_DATA. Bundle لتحسين البحث، كما هو موضح في المثال التالي:

Kotlin

val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false

Java

Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
    boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}

استخدام تطبيق "بحث Google" المصغّر

صورة تعرض طريقة عرض البحث في الشريط العلوي للتطبيق

الشكل 1. الأداة SearchViewباسم عرض الإجراء في شريط التطبيق.

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

ضبط تطبيق "بحث Google" المصغّر

بعد إنشاء ضبط البحث نشاط قابل للبحث، تفعيل البحث المدعوم لكل SearchView من خلال الاتصال setSearchableInfo() وتمريره الكائن SearchableInfo الذي يمثل وتهيئة البحث.

يمكنك الحصول على إشارة إلى SearchableInfo من خلال الاتصال getSearchableInfo() في SearchManager

على سبيل المثال، إذا كنت تستخدم SearchView كطريقة عرض إجراء في شريط التطبيق، قم بتمكين الأداة أثناء onCreateOptionsMenu() كما هو موضح في المثال التالي:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the options menu from XML.
    val inflater = menuInflater
    inflater.inflate(R.menu.options_menu, menu)

    // Get the SearchView and set the searchable configuration.
    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    (menu.findItem(R.id.menu_search).actionView as SearchView).apply {
        // Assumes current activity is the searchable activity.
        setSearchableInfo(searchManager.getSearchableInfo(componentName))
        setIconifiedByDefault(false) // Don't iconify the widget. Expand it by default.
    }

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the options menu from XML.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Get the SearchView and set the searchable configuration.
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    // Assumes current activity is the searchable activity.
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // Don't iconify the widget. Expand it by default.

    return true;
}

تمّت الآن ضبط أداة "بحث Google" وسيعرض النظام طلبات البحث إلى نشاطك القابل للبحث. يمكنك أيضًا تفعيل اقتراحات البحث في تطبيق "بحث Google" المصغّر.

لمزيد من المعلومات عن طرق عرض الإجراءات في شريط التطبيقات، يُرجى الاطّلاع على استخدام طرق عرض الإجراءات والإجراءات .

ميزات أخرى لتطبيق "بحث Google" المصغّر

يوفّر لك تطبيق "SearchView" المصغّر بعض الميزات الإضافية. قد ترغب في:

زر الإرسال
لا يتوفّر زر لإرسال طلب البحث بشكل تلقائي، لذلك يجب على المستخدم اضغط على مفتاح Return في لوحة المفاتيح لبدء عملية بحث. إِنْتَ يمكن إضافة "إرسال" من خلال إجراء setSubmitButtonEnabled(true)
تنقيح طلب البحث لاقتراحات البحث
عند تفعيل اقتراحات البحث، تتوقع عادةً أن يختار المستخدمون الاقتراحات، ولكنهم قد يرغبون أيضًا في تحسين طلب البحث المقترح. يمكنك إضافة زر بجانب كل اقتراح يؤدي إلى إدراج الاقتراح. في مربع البحث ليصفها المستخدم عن طريق استدعاء setQueryRefinementEnabled(true)
القدرة على إيقاف/تفعيل إمكانية رؤية مربّع البحث
يتم "تحويل" تطبيق "البحث" إلى رمز تلقائي مما يعني أنه ممثلة فقط بأيقونة البحث - عدسة مكبرة. يتوسع إلى إظهار مربع البحث عندما ينقر المستخدم على الرمز. كما هو موضح في المقالة السابقة مثلاً، يمكنك إظهار مربع البحث افتراضيًا من خلال استدعاء setIconifiedByDefault(false) يمكنك أيضًا تبديل مظهر تطبيق "بحث Google" المصغّر من خلال استدعاء setIconified()

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

استخدام كل من الأداة ومربع الحوار

إذا أدرجت تطبيق "بحث Google" المصغّر في شريط التطبيق action view وتفعيله ليظهر في شريط التطبيقات في حال وجود مساحة، وذلك عن طريق android:showAsAction="ifRoom"، ويمكن أن تعرض أداة "بحث Google" لن تظهر كعرض إجراء. بدلاً من ذلك، قد يظهر عنصر قائمة في القائمة الكاملة القائمة. على سبيل المثال، عند تشغيل تطبيقك على شاشة أصغر، قد لا يكون هناك مساحة كافية في شريط التطبيقات لعرض تطبيق "بحث Google" المصغّر مع إجراءات أخرى أو عناصر التنقل، لكي يظهر عنصر القائمة بدلاً من ذلك في القائمة الكاملة القائمة. عند وضعه في القائمة الكاملة، يعمل العنصر كقائمة عادية ولا يعرض طريقة عرض الإجراءات، أي أداة البحث.

لمعالجة هذا الموقف، يجب أن يتوفّر عنصر القائمة الذي تُرفِق به أداة "بحث Google" يجب تنشيط مربع حوار البحث عندما يحدده المستخدم من القائمة الكاملة. لتحقيق ذلك، نفذ onOptionsItemSelected() للتعامل مع طلبات "البحث" عنصر القائمة وفتح مربع حوار البحث من خلال استدعاء onSearchRequested()

لمزيد من المعلومات حول آلية عمل العناصر في شريط التطبيقات وكيفية التعامل معها لهذا الموقف، راجع إضافة شريط التطبيقات

إضافة بحث صوتي

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

يظهر ذلك في المثال التالي:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search_label"
    android:hint="@string/search_hint"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" >
</searchable>

يجب إدخال القيمة showVoiceSearchButton لتفعيل الصوت. بحث. وتحدد القيمة الثانية، launchRecognizer، أنه يجب أن يشغّل زر البحث الصوتي أداة التعرّف التي تعرض النص المحوّل إلى النشاط القابل للبحث.

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

إضافة اقتراحات بحث

يمكن أن يقدّم كل من مربّع حوار البحث وأداة "بحث Google" اقتراحات بحث. كنوع المستخدم، بمساعدة نظام Android. يدير النظام قائمة الاقتراحات ويتعامل مع الحدث عندما يختار المستخدم اقتراحنا.

يمكنك تقديم نوعَين من اقتراحات البحث:

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