מקטע מייצג חלק מודולרי של המשתמש ממשק בתוך פעילות. למקטע יש מחזור חיים משלו, מקבל את שלו אירועי קלט, וניתן להוסיף או להסיר מקטעים בזמן שהרכיבים פעילה.
במסמך הזה נסביר איך ליצור מקטע ולכלול אותו בפעילות.
הגדרת הסביבה
מקטעים דורשים תלות
ספריית מקטעים של 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.3" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.8.3" // 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.