25 -اندرويد – Fragments: التواصل مع بقية ال Fragments
ملاحظة : الموضوع عبارة عن حلقة من حلقات سلسلة برمجة وتطوير اندرويد Android Development
اندرويد : Fragments: التواصل مع بقية ال Fragments
السلام عليكم ورحمة الله وبركاته
سوف نتحدث في هذا الدرس عن آلية التواصل بين ال Fragments مع الفعالية المستضيفة لها , وبين ال Fragments بين بعضهم البعض.
الدرس قيم جدا ويحوي رغم قصره على كم كبير من المعلومات المفيدة فيما يخص ال Fragments ارجو لكم الفائدة.
سوف نتعلم في هذا الدرس ما يلي :
- تعريف واجهة Define an Interface
- تحقيق الواجهة ( اي كتابة الكود اللازم لها)Implement the Interface
- نقل رسالة إلى ال Fragment , Deliver a Message to a Fragment
لكي تستطيع اعادة استخدام ال Fragments التي تمثل مكونات واجهة المستخدم UI components , يتوجب عليك بناء كل fragments على شكل كينونة مستقلة بشكل كامل, مكون وحدوي modular component تقوم بتعريف تنسيقهاتها بنفسها بالاضافة إلى سلوكها.
ما إن تقوم بتعريف هذه ال fragments القابلة لاعادة الاستخدام , حتى يصبح باستطاعتك ارفاقهم مع اي فعالية activity وربطهم مع منطق التطبيق لتحقق واجهة المستخدم المركبة المطلوبة.
غالبا ما تحتاج إلى ان تتواصل وتتفاعل ال Fragments مع بعضها البعض, على سبيل المثال لتغيير المحتوى اعتمادا على احداث المستخدم.
تتم كل اساليب التواصل بين Fragments-to-Fragment من خلال ال Activity المرفقين بها.
ولا يتوجب ابدا ان تتواصل ال Fragments مع بعضها البعض بشكل مباشر.
تعريف واجهة Define an Interface
لكي نمكن ال fragments من التواصل مع فعاليتها,بإمكاننا ان نعرف واجهة Interface ضمن صف ال Fragment ونقوم بتحقيق implement هذا الصف ضمن الفعالية.
تلتقط ال Fragment تحقيق الواجهة الخاصة بها ضمن مرحلة استدعاء التابع onAttach() من دورة حياة ال fragment , ومن ثم يصبح باستطاعتها استدعاء توابع الواجهة لكي تتواصل مع الفعالية.
فيما يلي مثال عن طريقة التواصل بين ال Fragment والفعالية Activity :
OnHeadlineSelectedListener mCallback;// Container Activity must implement this interface
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}@Override
public void onAttach(Activity activity) {
super.onAttach(activity);// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ ” must implement OnHeadlineSelectedListener”);
}
}…
}
الآن اصبح بإمكان ال Fragment نقل الرسائل إلى الفعالية عبر استدعاء التابع onArticleSelected() (أو اية تواقع اخرى ضمن الواجهة) باستخدام مستنسخ mCallback الخاص بالواجهة OnHeadlineSelectedListener.
على سبيل المثال, يتم استدعاء التابع التالي الموجود ضمن ال fragment عندما ينقر المستخدم على عناصر القائمة.
يستخدم ال fragment واجهة الاستدعاء لينقل الأحداث إلى الفعالية الأب.
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Send the event to the host activity
mCallback.onArticleSelected(position);
}
تحقيق الواجهة Implement the Interface
لكي نستطيع استقبال استدعاءات الاحداث من ال fragment, فإنه يتوجب على الفعالية activity التي تستضيف ال fragment ان تقوم بتحقيق Implement الواجهة المعرفة ضمن صف ال fragment.
على سبيل المثال, تقوم الفعالية التالية بتحقيق الواجهة المعرفة في ال fragment ضمن المثال السابق.
implements HeadlinesFragment.OnHeadlineSelectedListener{
…public void onArticleSelected(int position) {
// The user selected the headline of an article from the HeadlinesFragment
// Do something here to display that article
}
}
توصيل رسالة إلى ال Fragment , Deliver a Message to a Fragment
بإمكان الفعالية المستضيفة لل fragment ان تقوم بتوصيل رسائل إلى ال fragment عبر التقاط مستنسخ ال Fragment باستخدام التابع findFragmentById(), ومن ثم تقوم بشكل مباشر باستدعاء التوابع العامة لهذا ال Fragment.
على سبيل المثال, تخيل بأن الفعالية المبينة اعلاه قد تحتوي على fragment اخر يستخدم لعرض العنصر المحدد عبر المعطيات المعادة ضمن تابع الاستدعاء اعلاه. في هذه الحالة , بإمكان الفعالية تمرير المعلومات المستقبلة عبر تابع الاستدعاء إلى fragment آخر والذي بدوره سيقوم بعرض العنصر المطلوب.
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
…
public void onArticleSelected(int position) {
// The user selected the headline of an article from the HeadlinesFragment
// Do something here to display that article
ArticleFragment articleFrag = (ArticleFragment)
getSupportFragmentManager().findFragmentById(R.id.article_fragment);
if (articleFrag != null) {
// If article frag is available, we’re in two-pane layout…
// Call a method in the ArticleFragment to update its content
articleFrag.updateArticleView(position);
} else {
// Otherwise, we’re in the one-pane layout and must swap frags…
// Create fragment and give it an argument for the selected article
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
}
}
}
وعند هذه النقطة نكون قد انتهينا من شرح المثال البرمجي الذي استمر معنا على ما يقارب الثلاث حلقات.
وسنتوقف عند هذا القدر مع المعلومات حول ال Fragment لنتحول إلى موضوع اخر مهم ألا وهو ” تخزين المعطيات” Saving Data
وإلى ذلك الحين استودعكم الله والسلام عليكم ورحمة لله وبركاته.
المصطلح | الترجمة |
implement |
تحقيق , اي كتابة الكود البرمجي اللازم |
Interface |
واجهة |
Instance |
مستنسخ |
modular component |
مكون وحدوي – ان جاز التعبير- |
Tag:Android, android BroadcastReceiver, android ContentProvider, android Intent, android operation system, Android Programming, Android system, android Temperature converter, AndroidManifest file, Building a Flexible UI using fragments, Communicating with other fragments, create fragment, Fragments, Supporting Different Devices, برمجة اندرويد, بناء واجهة مستخدم ديناميكية عبر استخدام Fragments, تشغيل الفعالية اندرويد, تطوير وبرمجة اندرويد, نظام اندرويد