إنشاء جزء

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

يصف هذا المستند كيفية إنشاء جزء وتضمينه في نشاط.

إعداد البيئة

تتطلب الأجزاء الاعتماد على مكتبة 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.6.2"

    // Java language implementation
    implementation "androidx.fragment:fragment:$fragment_version"
    // Kotlin
    implementation "androidx.fragment:fragment-ktx:$fragment_version"
}

Kotlin

dependencies {
    val fragment_version = "1.6.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 بمزيد من التفاصيل في دليل مدير الأجزاء.