יצירת מקטע

מקטע מייצג חלק מודולרי של המשתמש ממשק בתוך פעילות. למקטע יש מחזור חיים משלו, מקבל את שלו אירועי קלט, וניתן להוסיף או להסיר מקטעים בזמן שהרכיבים פעילה.

במסמך הזה נסביר איך ליצור מקטע ולכלול אותו בפעילות.

הגדרת הסביבה

מקטעים דורשים תלות ספריית מקטעים של AndroidX. צריך: להוסיף את מאגר 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 של האפליקציה:

Groovy

dependencies {
    def fragment_version = "1.8.5"

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

Kotlin

dependencies {
    val fragment_version = "1.8.5"

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

יצירת מחלקה של מקטעים

כדי ליצור מקטע, צריך להרחיב את AndroidX מחלקה Fragment ושינוי שם ברירת המחדל שיטות להטמעת הלוגיקה של האפליקציה, בדומה לאופן שבו יוצרים כיתה ב-Activity. כדי ליצור שמגדיר את הפריסה שלו, מספק את משאב הפריסה של המקטע ל-constructor של הבסיס, כמו בדוגמה הבאה:

Kotlin

class ExampleFragment : Fragment(R.layout.example_fragment)

Java

class ExampleFragment extends Fragment {
    public ExampleFragment() {
        super(R.layout.example_fragment);
    }
}

ספריית Fragment מספקת גם מחלקות בסיס של מקטעים (Fragment) מיוחדות יותר:

DialogFragment
מוצגת תיבת דו-שיח צפה. כדאי להשתמש בכיתה הזו כדי ליצור תיבת דו-שיח היא חלופה לשימוש ב-methods של תיבת הדו-שיח, מחלקה 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. לאחר מכן אפשר ליצור מקטע בתוך ה-method של 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(), ואפשר להשתמש בשיטות המתאימות של getter 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 במדריך Fragment Manager.