Fragmen mewakili bagian modul antarmuka pengguna dalam aktivitas. Fragmen memiliki siklus prosesnya sendiri dan menerima peristiwa inputnya sendiri. Anda dapat menambahkan atau menghapus fragmen saat aktivitas yang memuatnya sedang berjalan.
Dokumen ini menjelaskan cara membuat fragmen dan menyertakannya dalam aktivitas.
Menyiapkan lingkungan Anda
Fragmen memerlukan dependensi
pada library AndroidX Fragment. Anda perlu menambahkan
repositori Maven Google
ke file settings.gradle
project Anda untuk menyertakan dependensi ini.
Groovy
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Untuk menyertakan library AndroidX Fragment ke project Anda, tambahkan dependensi
berikut di file build.gradle
aplikasi Anda:
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") }
Membuat class fragmen
Untuk membuat fragmen, perluas class Fragment
AndroidX, dan ganti metodenya
untuk menyisipkan logika aplikasi Anda, mirip dengan cara membuat class Activity
. Untuk membuat fragmen
minimal yang menentukan tata letaknya sendiri, berikan resource tata letak fragmen
Anda ke konstruktor dasar, seperti ditunjukkan pada contoh berikut:
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment)
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } }
Library Fragment juga menyediakan class dasar fragmen khusus lainnya:
DialogFragment
- Menampilkan dialog mengambang. Menggunakan class ini untuk membuat dialog adalah
alternatif yang baik untuk menggunakan metode bantuan dialog
dalam class
Activity
karena fragmen otomatis menangani pembuatan dan pembersihanDialog
. Lihat Menampilkan dialog denganDialogFragment
untuk detail selengkapnya. PreferenceFragmentCompat
- Menampilkan hierarki objek
Preference
sebagai daftar. Anda dapat menggunakanPreferenceFragmentCompat
untuk membuat layar setelan untuk aplikasi Anda.
Menambahkan fragmen ke aktivitas
Umumnya, fragmen Anda harus disematkan dalam
FragmentActivity
AndroidX
untuk menyumbangkan sebagian UI ke tata letak aktivitas tersebut. FragmentActivity
adalah class dasar untuk
AppCompatActivity
,
jadi jika Anda sudah menentukan subclass AppCompatActivity
untuk memberikan kompatibilitas
mundur dalam aplikasi, Anda tidak perlu mengubah
class dasar aktivitas.
Anda dapat menambahkan fragmen ke hierarki tampilan aktivitas dengan menentukan
fragmen di file tata letak aktivitas atau dengan menentukan
penampung fragmen di file tata letak aktivitas, lalu
menambahkan fragmen dari dalam aktivitas secara terprogram. Dalam kedua kasus ini, Anda perlu
menambahkan
FragmentContainerView
yang menentukan lokasi tempat fragmen harus berada dalam
hierarki tampilan aktivitas. Sebaiknya selalu gunakan
FragmentContainerView
sebagai penampung fragmen
karena FragmentContainerView
menyertakan perbaikan khusus untuk fragmen yang tidak disediakan
oleh kelompok tampilan lain seperti FrameLayout
.
Menambahkan fragmen melalui XML
Untuk menambahkan fragmen ke XML tata letak aktivitas secara deklaratif, gunakan
elemen FragmentContainerView
.
Berikut adalah contoh tata letak aktivitas yang berisi
satu 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" />
Atribut android:name
menentukan nama class Fragment
untuk pembuatan
instance. Saat tata letak aktivitas di-inflate, fragmen yang ditentukan
dibuat instance-nya,
onInflate()
dipanggil pada fragmen yang baru dibuat instance-nya tersebut, dan FragmentTransaction
dibuat untuk menambahkan fragmen ke FragmentManager
.
Menambahkan fragmen secara terprogram
Untuk menambahkan fragmen secara terprogram ke tata letak aktivitas,
tata letak harus menyertakan FragmentContainerView
untuk berfungsi sebagai penampung fragmen,
seperti ditunjukkan dalam contoh berikut:
<!-- 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" />
Tidak seperti pendekatan XML, atribut android:name
tidak digunakan pada FragmentContainerView
di sini, sehingga tidak ada fragmen khusus yang otomatis dibuat instance-nya. Sebagai gantinya,
FragmentTransaction
digunakan untuk membuat instance fragmen dan menambahkannya ke tata letak aktivitas.
Saat aktivitas Anda berjalan, Anda dapat melakukan transaksi fragmen seperti
menambahkan, menghapus, atau mengganti fragmen. Di FragmentActivity
, Anda bisa
mendapatkan instance
FragmentManager
, yang
dapat digunakan untuk membuat FragmentTransaction
. Lalu, Anda dapat membuat instance
fragmen dalam metode onCreate()
aktivitas menggunakan
FragmentTransaction.add()
,
dengan meneruskan ID ViewGroup
penampung dalam tata letak dan class
fragmen yang ingin Anda tambahkan, lalu meng-commit transaksi tersebut, seperti ditunjukkan pada contoh berikut:
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(); } } }
Pada contoh sebelumnya, perhatikan bahwa transaksi fragmen hanya dibuat saat
savedInstanceState
adalah null
. Ini untuk memastikan bahwa fragmen
hanya ditambahkan satu kali, saat aktivitas pertama kali dibuat. Saat
perubahan konfigurasi terjadi dan aktivitas dibuat ulang,
savedInstanceState
tidak lagi null
, dan fragmen tidak perlu ditambahkan
untuk kedua kalinya karena fragmen akan otomatis dipulihkan dari savedInstanceState
.
Jika fragmen Anda memerlukan sejumlah data awal, argumen dapat diteruskan ke fragmen Anda dengan memberikan Bundle
dalam panggilan ke FragmentTransaction.add()
, seperti ditunjukkan di bawah ini:
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(); } } }
Argumen Bundle
kemudian dapat diambil dari dalam fragmen dengan
memanggil
requireArguments()
,
dan metode pengambil Bundle
yang sesuai dapat digunakan untuk mengambil
setiap argumen.
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"); ... } }
Lihat juga
Transaksi fragment dan FragmentManager
dibahas lebih mendetail
di Panduan pengelola fragmen.