الأربعاء، 27 نوفمبر 2019

ماهو التجزئة او التقسيم Fragment في برمجة الأندرويد Android Fragment#

ماهو التجزئة او التقسيم Fragment في برمجة الأندرويد

 Android Fragment# 



ماهو التجزئة او التقسيم Fragment في برمجة الأندرويد Android Fragment# 




ماهو التجزئة Fragment.
ببساطة هي تجزئة او تقسيم الأنشطة إلى عدة أنشطة فرعية يتم استخدامها عند تفاعل المستخدم معها مثل عملية إنشاء عدة tab في الواجهة او صفحات النت بحيث كل tab يتم تنفيذه عندما يقوم المستخدم بالضغط عليه.وهكذا. tab تستخدم في php وا asp.net وتطبيقات الويندوز.
في الأندرويد الـ Fragment  هي جزء من الـ Activity و يمكننا القول بأنها Sub-Activity. هذه الـ Fragment هي تمثل جزء من واجهة المستخدم في الـ Activity الحالية. نستطيع مثلا دمج 3 من الـ Fragments داخل Activity. و لا ننسى أن دورة حياة ال Fragment تتأثر بدورة حياة الـ Activity.
برمجياً: الـ Fragment  هي Java Class , أي أنني استطيع بناءها مثل ما يمكنني بناء أي Activity  عادية.

إذن ما الحاجة إلى الـ Fragments:

  • قبل استخدام الـ Fragments كنا نستطيع إظهار Activity واحدة فقط على الشاشة في الوقت الحالي للمستخدم, إذن كان من الصعب تقسيم الشاشة إلى عدد من الأجزاء كل جزء يؤدي مهمة معينة. و لكن مع الـ Fragments استطعنا عمل ذلك بتقسيم الـ Activity إلى عدد من الأجزاء Fragments و التحكم في كل جزء بشكل منفصل. بذلك كل Fragment  لها events و Layouts خاصة بها مثل الـ Activity تمام

ما هي الإمكانيات المتاحة مع الـ Fragments:

  • نستطيع إضافة و حذف الـ Fragment  أثناء تشغيل الـ Activity.
  • الـ Fragment   لها Layout خاصة بها و دورة حياة مستقلة كذلكز
  • الـ Fragment  يمكن اعادة استخدامها في عدة Activities.
  • يمكننا أيضاً دمج عدد من الـ Fragment  داخل Activity واحدة.
  • يمكن أن الـ Fragment  تشكّل جزء من الـ Activity و ممكن تأخذ الـ Activity كاملة.
  • ممكن إظهار عدد من الـ Fragment  في نفس الوقت و ممكن عمل تبديل “swapping” بينها.



دوره حياه الجزء Fragment 

 التجزئة fragment الأندرويد  لها دوره حياتها مشابهه جدا لنشاط الاندرويد. وهذا القسم يطلع علي مراحل مختلفه من دوره حياته.


فيما يلي قائمة بالطرق التي يمكنك تجاوزها في فئة الأجزاء -


 onAttach () مثيل الجزء مرتبط بنسخة نشاط. الجزء والفعالية غير مهيأة بالكامل.  عادةً ما تحصل في هذه الطريقة على مرجع للنشاط الذي يستخدم الجزء لمزيد من أعمال التهيئة.

 onCreate () يستدعي النظام هذه الطريقة عند إنشاء الجزء.  يجب عليك تهيئة المكونات الأساسية للجزء الذي تريد الاحتفاظ به عندما يتم إيقاف الجزء مؤقتًا أو إيقافه ، ثم استئنافه.

 onCreateView () يقوم النظام باستدعاء رد الاتصال هذا عندما يحين الوقت لتتمكن الشظية من رسم واجهة المستخدم الخاصة بها لأول مرة.  لرسم واجهة مستخدم للشظية الخاصة بك ، يجب عليك إرجاع مكون عرض من هذه الطريقة التي هي جذر تخطيط الجزء الخاص بك.  يمكنك العودة خالية إذا كانت القطعة لا توفر واجهة مستخدم.

onCreateView () يقوم النظام باستدعاء رد الاتصال هذا عندما يحين الوقت لتتمكن الشظية من رسم واجهة المستخدم الخاصة بها لأول مرة.  لرسم واجهة مستخدم للشظية الخاصة بك ، يجب عليك إرجاع مكون عرض من هذه الطريقة التي هي جذر تخطيط الجزء الخاص بك.  يمكنك العودة خالية إذا كانت القطعة لا توفر واجهة مستخدم.

 onActivityCreated () يسمى onActivityCreated () بعد أسلوب onCreateView () عند إنشاء نشاط المضيف.  تم إنشاء مثيل للنشاط والجزء بالإضافة إلى عرض التسلسل الهرمي للنشاط.  في هذه المرحلة ، يمكن الوصول إلى طريقة العرض باستخدام طريقة findViewById ().  المثال.  في هذه الطريقة ، يمكنك إنشاء كائنات تتطلب عنصر سياق
onStart () يتم استدعاء الأسلوب onStart () بمجرد ظهور الجزء.
 onResume () يصبح جزء نشط.
 onPause () يستدعي النظام هذه الطريقة كأول إشارة إلى أن المستخدم يغادر الجزء.  هذا هو المكان الذي يجب أن ترتكب فيه أي تغييرات يجب أن تستمر بعد جلسة المستخدم الحالية.
 سيتم إيقاف جزء onStop () عن طريق استدعاء onStop ()
 سيتم تدمير طريقة العرض onDestroyView () جزء بعد استدعاء هذه الطريقة
 تم استدعاء onDestroy () onDestroy () لإجراء التنظيف النهائي لحالة الجزء ولكن ليس مضمونًا ليتم استدعاؤه بواسطة نظام Android الأساسي.

تطبيق للـ Fragments  و TabLayout

  • أنشيء مشروع جديد في الأندرويد



File >> new >> Fragment >> Blank Fragment

  • سنكرر الخطوة السابقة لإضافة الـ Fragment  الثاني بإسم: “SundayFragment”
  • سنقوم ببناء Adapter مخصصة نحدد بداخلها عدد الـ Tabs  و الـ Fragments, أيضاً نعرف بداخلها عناوين الـ Tabs. لعمل ذلك نقوم بإنشاء كلاس جديدة و تسميتها FragmentAdapterSimple.jav


كيفية استخدامة  fragments ؟
 يتضمن هذا عددًا من الخطوات البسيطة لإنشاء الأجزاء.

 بادئ ذي بدء ، حدد عدد الأجزاء التي تريد استخدامها في نشاط ما.  على سبيل المثال ، دعنا نستخدم جزأين للتعامل مع الوضعين الأفقي والصوري للجهاز.

 بعد ذلك ، بناءً على عدد الأجزاء ، قم بإنشاء فئات من شأنها أن تمدد فئة الأجزاء.  فئة Fragment المذكورة أعلاه وظائف رد الاتصال المذكورة.  يمكنك تجاوز أي من الوظائف بناءً على متطلباتك.

 المقابلة لكل جزء ، سوف تحتاج إلى إنشاء ملفات تخطيط في ملف XML.  سيكون لهذه الملفات تخطيط للأجزاء المحددة.

 أخيرًا ، قم بتعديل ملف النشاط لتحديد المنطق الفعلي لاستبدال الأجزاء وفقًا لمتطلباتك.

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

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

التجزئة Fragment القائمة - تسمى Fragment التي لها عرض قائمة خاصة باسم  قائمة Fragment 

  المعاملة  fragment - باستخدام مع التجزئة .  يمكننا نقل جزء واحد إلى جزء آخر.


نكتب بداخلها الكود التالي:
public class FragmentAdapterSimple extends FragmentPagerAdapter {
    private Context mContext;
    public FragmentAdapterSimple(Context context, FragmentManager fm)
    {
        super(fm);
        mContext = context;
    }
    @Override
    public Fragment getItem(int position) {
        if (position == 0) {
            return new SaturdayFragment();
        } else {
            return new SundayFragment();
        }
    }
    @Override
    public int getCount() {
        return 2;
    }
    @Override
    public CharSequence getPageTitle(int position) {
        if (position == 0) {
            return mContext.getString(R.string.string1);
        } else  {
            return mContext.getString(R.string.string2);
        }
    }
}
  • الآن بقي تهيئة الـ Main Activity  , و الـ XML  الخاصة بها:
في الـ activity-main.xml نقوم بإضافة أداة ViewPager للتنقل بين الـ Fragments, أيضاً أداة الـ TabLayout  لكي نضع تبويب لكل Fragment.
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.khadijah.fragment2.MainActivity">
    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/viewpager"></android.support.v4.view.ViewPager>
</LinearLayout>
نلاحظ أننا وضعنا id لكل أداة لكي نستطيع التعامل معها من الـ MainActivity.java كالتالي
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Set the content of the activity to use the activity_main.xml layout file
        setContentView(R.layout.activity_main);
        // Find the view pager that will allow the user to swipe between fragments
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        // Create an adapter that knows which fragment should be shown on each page
        FragmentAdapterSimple adapter = new FragmentAdapterSimple(this, getSupportFragmentManager());
        // Set the adapter onto the view pager
        viewPager.setAdapter(adapter);
        // Find the tab layout that shows the tabs
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        // Connect the tab layout with the view pager. This will
        //   1. Update the tab layout when the view pager is swiped
        //   2. Update the view pager when a tab is selected
        //   3. Set the tab layout's tab names with the view pager's adapter's titles
        //      by calling onPageTitle()
        tabLayout.setupWithViewPager(viewPager);
    }
}
 

شرح لألية تنفيذ الكود:

  • أولا عند تشغيل التطبيق يتم فتح الـ MainActivity و بداخلها الـ ViewPager layout و التي تسأل FragmentAdapterSimple.java (التي قمنا بإنشاءها و تعتبر هي مصدر البيانات للـ ViewPager) عن عدد الصفحات (Pages) ؟ و ستجد الإدابة من خلال الدالة:
@Override
public int getCount() {
    return 2;
}
  • بعدها الـ ViewPager تقوم بإظهار الـ Fragment رقم صفر و ذلك أيضاً من خلال الدالة التالية في الـ  FragmentAdapterSimple.java.
@Override
public Fragment getItem(int position) {
    if (position == 0) {
        return new SaturdayFragment();
    } else {
        return new SundayFragment();
    }
}
  • أخيرا عندما يقوم المستخدم بعمل مسح أو swipe للشاشة سيتم التنقل بين الـ Pages, و هذا أيضاً يعني أن ViewPager طلبت من الـ FragmentAdapterSimple.java الانتقال للـ Fragment التالية. و هكذا حسب الـ position الخاصة بالـ Fragment.
  •  و لا ننسى وظيفة الدالة التالية التي تحدد عناوين للـ Tabs  الخاصة بكل Fragment:
public CharSequence getPageTitle(int position) {
    if (position == 0) {
        return mContext.getString(R.string.string1);
    } else  {
        return mContext.getString(R.string.string2);
    }
}

 انواع التجزئة او التقسيم الواجهة الرسومية واجهة المستخدم في الأندرويد Types of Fragments

توجد ٣ انواع 
  1. Single frame fragmen التقسيم ذات الإطار الفردي او الواحد: اضغط هنا لمشاهدة مثال على الإطار الفردي.
  2. List fragments التقسيم ذات القوائم 
  3. Fragments transactionالتقسيم ذات التحويل .






التسميات: