تکه نشاندهنده بخش مدولار میانای کاربر در یک فعالیت است. قطعه چرخه حیات خودش را دارد، رویدادهای ورودی خودش را دریافت میکند، و میتوانید درحین اجرای فعالیت حاوی قطعه، قطعهها را اضافه یا حذف کنید.
این سند نحوه ایجاد قطعه و گنجاندن آن در فعالیت را شرح میدهد.
راهاندازی محیط
قطعهها به وابستگی به
کتابخانه قطعه AndroidX نیاز دارند. برای افزودن این وابستگی، باید
مخزن Google Maven را
به فایل settings.gradle پروژهتان اضافه کنید.
شیک
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
کاتلین
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
برای گنجاندن کتابخانه AndroidX Fragment در پروژهتان، وابستگیهای زیر را در فایل build.gradle برنامهتان اضافه کنید:
شیار
dependencies { def fragment_version = "1.9.1" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
کاتلین
dependencies { val fragment_version = "1.9.1" // Java language implementation implementation("androidx.fragment:fragment:$fragment_version") // Kotlin implementation("androidx.fragment:fragment-ktx:$fragment_version") }
ایجاد کلاس قطعه
برای ایجاد قطعه، کلاس AndroidX
Fragment را گسترش دهید و روشهای آن را لغو کنید تا منطق برنامهتان را درج کنید، مشابه روشی که کلاس Activity را ایجاد میکنید. برای ایجاد یک قطعه حداقلی که چیدمان خودش را تعریف میکند، منبع چیدمان قطعهتان را به سازنده پایه ارائه دهید، همانطور که در مثال زیر نشان داده شده است:
کاتلین
class ExampleFragment : Fragment(R.layout.example_fragment)
جاوا
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 را برای نمونهسازی مشخص میکند. When the activity's layout is inflated, the specified fragment
is instantiated,
onInflate()
is called on the newly instantiated fragment, and a FragmentTransaction
is created to add the fragment to the 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 محفظه را در طرحبندیتان و کلاس قطعهای را که میخواهید اضافه کنید ارسال کنید، و سپس تراکنش را همانطور که در مثال زیر نشان داده شده است ثبت کنید:
کاتلین
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) } } } }
جاوا
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()، آرگومانها را به قطعه شما ارسال کرد، همانطور که در زیر نشان داده شده است:
کاتلین
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) } } } }
جاوا
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 برای بازیابی هر آرگومان استفاده کرد.
کاتلین
class ExampleFragment : Fragment(R.layout.example_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val someInt = requireArguments().getInt("some_int") ... } }
جاوا
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"); ... } }
همچنین مراجعه کنید به
تراکنشهای Fragment و FragmentManager با جزئیات بیشتر در
راهنمای مدیر Fragment پوشش داده شدهاند.