يمثل الجزء جزءًا مكونًا من واجهة المستخدم ضمن نشاط ما. للجزء دورة حياة خاصة به، ويتلقى أحداث الإدخال الخاصة به، ويمكنك إضافة أجزاء أو إزالتها أثناء تشغيل النشاط الذي يتضمنه.
يصف هذا المستند كيفية إنشاء جزء وتضمينه في نشاط.
إعداد البيئة
تتطلب الأجزاء الاعتماد على مكتبة AndroidX Fragment. عليك إضافة مستودع Google Maven إلى ملف settings.gradle
الخاص بمشروعك لتضمين هذه التبعية.
رائع
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
لتضمين مكتبة AndroidX Fragment في مشروعك، أضِف التبعيات التالية إلى ملف build.gradle
في تطبيقك:
رائع
dependencies { def fragment_version = "1.8.2" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.8.2" // Java language implementation implementation("androidx.fragment:fragment:$fragment_version") // Kotlin implementation("androidx.fragment:fragment-ktx:$fragment_version") }
إنشاء فئة أجزاء
لإنشاء جزء، عليك توسيع فئة AndroidX
Fragment
وإلغاء
أساليبه لإدراج منطق التطبيق، تمامًا كما لو كنت تنشئ فئة Activity
. لإنشاء جزء مصغر يحدد تنسيقه الخاص، قدّم مورد تنسيق الجزء الخاص بك إلى الدالة الإنشائية الأساسية، كما هو موضح في المثال التالي:
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment)
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } }
توفّر مكتبة Fragment أيضًا فئات أساسية أكثر تخصصًا للأجزاء:
DialogFragment
- عرض مربّع حوار عائم يُعدّ استخدام هذه الفئة لإنشاء مربّع حوار بديلاً جيدًا لاستخدام طرق مساعد مربّعات الحوار في الفئة
Activity
، لأنّ الأجزاء تعالج تلقائيًا إنشاءDialog
وإزالتها. راجِع عرض مربّعات الحوار باستخدامDialogFragment
لمعرفة مزيد من التفاصيل. PreferenceFragmentCompat
- عرض تدرج هرمي يضم عناصر
Preference
على شكل قائمة. يمكنك استخدامPreferenceFragmentCompat
لإنشاء شاشة إعدادات لتطبيقك.
إضافة جزء إلى نشاط
بشكل عام، يجب أن يكون الجزء مضمّنًا في AndroidX FragmentActivity
للمساهمة في جزء من واجهة المستخدم في تنسيق النشاط. FragmentActivity
هي الفئة الأساسية لـ
AppCompatActivity
،
لذلك إذا كنت تستخدم الفئة الفرعية AppCompatActivity
لتوفير التوافق مع الأنظمة القديمة في تطبيقك، لن تحتاج إلى تغيير الفئة
الأساسية لنشاطك.
يمكنك إضافة الجزء إلى العرض الهرمي لعرض النشاط إما عن طريق
تحديد الجزء في ملف تنسيق نشاطك أو عن طريق تحديد
حاوية للأجزاء في ملف تنسيق نشاطك ثم
إضافة الجزء آليًا من داخل نشاطك. في كلتا الحالتين، عليك إضافة عنصر FragmentContainerView
يحدّد المكان الذي يجب وضع الجزء فيه ضمن التدرّج الهرمي لطريقة عرض النشاط. ننصح بشدة باستخدام
FragmentContainerView
كحاوية للأجزاء، لأنّ
FragmentContainerView
تشتمل على إصلاحات خاصة بالأجزاء التي لا توفّرها مجموعات طرق العرض الأخرى، مثل FrameLayout
.
إضافة جزء عبر XML
لإضافة جزء بوضوح إلى تنسيق XML في تنسيق نشاطك، استخدِم
عنصر FragmentContainerView
.
في ما يلي مثال على تنسيق نشاط يحتوي على عنصر
FragmentContainerView
واحد:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.ExampleFragment" />
تحدد السمة android:name
اسم فئة Fragment
للإثبات. عند تضخم تنسيق النشاط، يتم إنشاء مثيل للجزء المحدد،
ويتم استدعاء onInflate()
على الجزء الذي تم إنشاء مثيل له حديثًا، ويتم إنشاء FragmentTransaction
لإضافة الجزء إلى FragmentManager
.
إضافة جزء بشكل آلي
لإضافة جزء بشكل آلي إلى تنسيق نشاطك، يجب أن يتضمّن التنسيق FragmentContainerView
ليكون بمثابة حاوية للأجزاء، كما هو موضّح في المثال التالي:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
وعلى عكس طريقة XML، لا يتم استخدام السمة android:name
في
FragmentContainerView
هنا، لذا لا يتم إثبات صحة جزء محدّد تلقائيًا. بدلاً من ذلك، يتم استخدام FragmentTransaction
لإنشاء مثيل للجزء وإضافته إلى تنسيق النشاط.
أثناء أداء نشاطك، يمكنك إجراء معاملات مجزّأة كإضافة جزء أو إزالته أو استبداله. في FragmentActivity
، يمكنك
الحصول على مثيل
FragmentManager
، الذي
يمكن استخدامه لإنشاء FragmentTransaction
. بعد ذلك، يمكنك إنشاء مثيل للجزء الخاص بك ضمن طريقة onCreate()
الخاصة بنشاطك باستخدام FragmentTransaction.add()
، مع تمرير رقم تعريف ViewGroup
للحاوية في التنسيق والجزء الذي تريد إضافته ثم إتمام المعاملة، كما هو موضّح في المثال التالي:
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, null) .commit(); } } }
في المثال السابق، لاحظ أنّه لا يتم إنشاء معاملة التجزئة إلا عندما تكون قيمة savedInstanceState
هي null
. وذلك لضمان إضافة الجزء مرة واحدة فقط، عند إنشاء النشاط لأول مرة. وعند
حدوث تغيير في الإعدادات وإعادة إنشاء النشاط،
يصبح الجزء savedInstanceState
غير null
، ولا يلزم إضافة
الجزء مرة أخرى، وذلك لأنّه تتم استعادة الجزء تلقائيًا
من savedInstanceState
.
إذا كان الجزء يتطلب بعض البيانات الأولية، يمكن تمرير الوسيطات إلى الجزء من خلال توفير Bundle
في طلب FragmentTransaction.add()
، كما هو موضّح أدناه:
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val bundle = bundleOf("some_int" to 0) supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view, args = bundle) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { Bundle bundle = new Bundle(); bundle.putInt("some_int", 0); getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, bundle) .commit(); } } }
يمكن بعد ذلك استرداد الوسيطات Bundle
من داخل الجزء من خلال استدعاء
requireArguments()
،
ويمكن استخدام طرق الاستلام Bundle
المناسبة لاسترداد كل وسيطة.
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val someInt = requireArguments().getInt("some_int") ... } }
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { int someInt = requireArguments().getInt("some_int"); ... } }
راجع أيضًا
يمكنك الاطّلاع على معاملات التجزئة وFragmentManager
بمزيد من التفاصيل في دليل مدير الأجزاء.