46 : اندرويد : اعداد واجهة المستخدم الخاصة بالبحث Setting Up the Search Interface

 

ملاحظة : الموضوع عبارة عن حلقة من حلقات سلسلة برمجة وتطوير اندرويد Android Development

اندرويد :   اعداد واجهة المستخدم الخاصة بالبحث Setting Up Search Interface

السلام عليكم ورحمة الله وبركاته

سوف نتعلم ضمن هذا الدرس مايلي :

  1. اضافة view خاص بالبحث إلى شريط الاحداث Action Bar
  2. إنشاء الاعدادات الخاصة بالبحث Create a Searchable Configuration
  3. إنشاء فعالية قابلة للبحث Create a Searchable Activity

قبل البدء يجب قراءة

  1. شريط الاحداث Action Bar

انطلاقا من اصدار 3.0 من اندرويد , اصبح استخدام العنصر  SearchView  ضمن شريط الاحداث action bar  عبارة عن الطريقة المثلى  لتحقيق امكانية البحث ضمن تطبيقك.

وكما هو الحال بالنسبة للعناصر الموجودة ضمن شريط الاحداث action bar فإنه بإمكانك ان تعرف وتهيئ العنصر SearchView  لكي يظهر في كل الاوقات, وذلك عندما يكون هنالك متسع له, او ان يظهر بشكل حدث قابل للطي, حيث يقوم  بعرض عنصر SearchView  بشكل ايقونة بشكل ابتدائي, ومن ثم يشغل كل شريط الاحداث على شكل  حقل خاص للبحث عندما ينقر المستخدم على هذه الايقونة.

ملاحظة : لاحقا ضمن هذا الدرس, سوف تتعلم كيف بإمكانك ان تجعل تطبيقك متوافقا مع اصدار 2.1 من اندرويد(API level 7) وذلك بالنسبة للاجهزة التي لا تدعم SearchView.

اضافة Search View  إلى شريط الاحداث action bar

لكي تقوم بإضافة SearchView  إلى شريط الاحداث action bar, انشأ ملف xml بالاسم التالي : res/menu/options_menu.xml  ضمن مشروعك , واضف إليه الترميز(الكود) التالي ادناه:

يقوم هذا الترميز بتعريف كيفية انشاء عنصر بحث, حيث نقوم على سبيل المثال بتعريف الايقونة التي نرغب باستخدامها , والعنوان الذي نريد لهذا العنصر.

تمكن خاصية collapseActionView  ال SearchView  من ان يشغل المساحة المتوافرة من شريط الاحداث action bar وذلك في حال استخدامه , ومن ان يطوى في حال عدم استخدامه.

وبسبب المساحة المحدودة ضمن شريط الاحداث action bar المتواجدة على الاجهزة الصغيرة, فإنه ينصح باستخدام الخاصية collapsibleActionView, وذلك لتزودنا بتجربة افضل للمستخدم.

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

ملاحظة : في حال كان لديك ملف xml جاهز ضمن تطبيقك خاص بعناصر القائمة menu items, فإنه بإمكانك اضافة العنصر<item>إلى ذلك الملف بدلا من انشاء ملف جديد.

لكي تقوم بعرض SearchView  ضمن شريط الحداث action bare, قم ب inflate   لملف ال xml الخاص بموارد القائمة (res/menu/options_menu.xml) ضمن التابع onCreateOptionsMenu()ضمن فعاليتك.

 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);return true;
}

اذا قمت بتشغيل تطبيقك الآن , فسوف يظهر العنصرSearchView  ضمن شريط الاحداث الخاص بتطبيقك, ولكنه لا يعمل. الآن انت بحاجة إلى ان تعرف كيفية عمل وسلوك العنصر SearchView.

إنشاء الاعدادات الخاصة بالبحث Create a Searchable Configuration

تقوم الاعدادات الخاصة بالبحث searchable configurationبتعريف سلوكيات العنصر SearchView  , ويتم تعريفها ضمن الملف res/xml/searchable.xml.

في الحد الآدنى , فإن اعدادات البحث يجب ان تحوي على الخاصية android:label  والتي تملك نفس قيمة الخاصية android:label للعناصر التالية :  <application>  او  <activity>ضمن ملف manifest  ضمن اندرويد.

على كل الاحوال, فإننا ايضا ننصح بإضافة خاصية 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" />

ضمن ملف manifest الخاص بتطبيقك, صرح عن العنصر <meta-data>الذي يشيير إلى الملف res/xml/searchable.xml , وبذلك يصبح بإمكان تطبيقك معرفة مكان تواجد الملف.

صرح عن هذا العنصر <meta-data>  ضمن العنصر <activity>   الذي ترغب في ان يتم عرض SearchView  ضمنه.

<activity ... >
    ...
    <meta-data android:name="android.app.searchable"
            android:resource="@xml/searchable" />

</activity>

ضمن التابع onCreateOptionsMenu()الذي قمت بإنشاءه من قبل, ارفق اعدادات البحث مع العنصر SearchView عبر استدعاء التابع setSearchableInfo(SearchableInfo):

 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager =
           (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));

    return true;
}

إن الاستدعاء للتابع getSearchableInfo()  يقوم باستحصال غرض  SearchableInfoالذي تم انشائه من قبل ملف xml الخاص باعدادات البحث.

ما إن يتم ارفاق اعدادات البحث بشكل صحيح مع ال SearchViewالخاص بك, حتى يقوم ال SearchView  بتشغيل فعالية مع ال ACTION_SEARCH Intent وذلك عندما يقوم المستخدم بتسجيل (اضافة) الامر الذي يرغب بالبحث عنه.

الآن , انت بحاجة إلى فعالية لهذه الACTION_SEARCH intent لتتعامل مع استعلام البحث الذي يدخله المستخدم.

إنشاء فعالية للبحث Create a Searchable Activity

يحاول ال SearchView  تشغيل فعالية عبر ال intent   ACTION_SEARCHوذلك عندما يقوم المستخدم بتسجيل استعلام ضمن صندوق البحث.

تقوم فعالية البحث searchable activity يفتلرة لل ACTION_SEARCH Intent  وتبحث عن نتائج الاستعلام ضمن هيكلية معطيات من الشكل data set.

لكي ننشأ فعالية بحث searchable activity  , نصرح عن فعالية من اختيارنا لتنقدح عند طلب ال ACTION_SEARCH intent  :

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

ضمن فعالية البحث تلك , نعالج عملية استدعاء ال ACTION_SEARCH intent عبر التحقق من وجودها ضمن التابع onCreate()ضمن تلك الفعالية.

ملاحظة : في حال كانت فعالية البحث الخاصة بك تعمل ضمن single top mode  (android:launchMode=”singleTop”) , ويتم ايضا التعامل مع ACTION_SEARCHintent ضمن التابع.

ضمن “single top mode”  يتم انشاء مستنسخ وجيد من الفعالية , وبالتالي فإن الاستدعاءات المتبقية لتشغيل فعاليتك , لن تقوم بإنشاء فعالية اخرى ضمن المكدس stack.

هذا النمط من انماط التشغيل launch mode  مفيد عندما يكون بإمكان المستخدمين ان يبحثوا ضمن نفس الفعالية بدون الحاجةى إلى انشاء مستنسخ جديد من الفعالية في كل مرة.

 

public class SearchResultsActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        handleIntent(getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        ...
        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {

        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            //use the query to search your data somehow
        }
    }
    ...
}

في حال قمت بتشغيل تطبيقك الآن , يصبح بإمكان عنصر ان يتلقى استعلامات المستخدم , ويقوم بتشغيل فعالية البحث searchable activity, عبر الACTION_SEARCH intent.

الآن الموضوع عندك لكي تحزر كيف سيتم تخزين المعطيات والبحث ضمنها عبر استخدام الاستعلام المعطى.

وسنوافيكم بالتفاصيل بالحلقة القادمة

وإلى ذلك الحين استودعكم الله والسلام عليكم ورحمة الله وبركاته

 

Advertisements

, , ,

  1. أضف تعليق

اترك رد

Please log in using one of these methods to post your comment:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

%d مدونون معجبون بهذه: