Membuat fragmen

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.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")
}

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 pembersihan Dialog. Lihat Menampilkan dialog dengan DialogFragment untuk detail selengkapnya.
PreferenceFragmentCompat
Menampilkan hierarki objek Preference sebagai daftar. Anda dapat menggunakan PreferenceFragmentCompat 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.