lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Membangun UI Fleksibel

Saat mendesain aplikasi untuk mendukung berbagai ukuran layar, Anda bisa menggunakan kembali fragmen dalam konfigurasi layout berbeda untuk mengoptimalkan pengalaman pengguna berdasarkan ruang layar yang tersedia.

Misalnya, pada perangkat handset, bisa jadi tepat untuk menampilkan satu fragmen dalam satu waktu untuk antarmuka pengguna satu panel. Sebaliknya, Anda mungkin ingin menyetel fragmen dari sisi ke sisi pada tablet yang memiliki ukuran layar yang lebih lebar untuk menampilkan informasi lebih lanjut kepada pengguna.

Gambar 1. Dua fragmen yang ditampilkan dalam konfigurasi yang berbeda untuk aktivitas yang sama pada berbagai ukuran layar. Pada layar besar, kedua fragmen muat dari sisi ke sisi, tetapi pada perangkat handset, hanya satu fragmen muat dalam satu waktu, jadi fragmen harus menggantikan satu sama lain seiring pengguna bernavigasi.

Kelas FragmentManager menyediakan metode yang mengizinkan Anda untuk menambahkan, membuang, dan mengganti fragmen ke sebuah aktivitas pada waktu proses untuk menciptakan pengalaman dinamis.

Menambahkan Fragmen ke Aktivitas di Waktu Proses

Ketimbang mendefinisikan fragmen untuk sebuah aktivitas di file layout—sesuai yang ditampilkan di pelajaran sebelumnya dengan elemen <fragment> —Anda dapat menambahkan satu fragmen ke aktivitas saat waktu proses aktivitas. Ini diperlukan jika Anda berencana untuk mengubah fragmen sepanjang masa hidup aktivitas.

Untuk melakukan transaksi seperti membuang fragmen, Anda harus menggunakan FragmentManager untuk membuat FragmentTransaction, yang menyediakan API untuk menambahkan, membuang, menggantikan, dan melakukan transaksi fragmen lainnya.

Jika aktivitas Anda memperbolehkan fragmen untuk dihapus dan digantikan, Anda perlu menambahkan fragmen awal ke aktivitas saat metode onCreate() aktivitas.

Aturan penting saat menangani fragmen—khususnya saat menambahkan fragmen di waktu proses—adalah bahwa layout aktivitas harus menyertakan kontainer View tempat Anda dapat menyisipkan fragmen.

Layout berikut merupakan alternatif dari layout yang ditampilkan pada pelajaran sebelumnya yang hanya menampilkan satu fragmen pada satu waktu. Untuk menggantikan satu fragmen dengan fragmen lain, layout aktivitas termasuk FrameLayout kosong yang bertindak sebagai kontainer fragmen.

Perhatikan bahwa nama file sama dengan file layout di pelajaran sebelumnya, tetapi direktori layout tidak memiliki qualifier large, jadi layout ini digunakan saat layar perangkat lebih kecil dari besar karena layar tidak memuat kedua fragmen pada waktu bersamaan.

res/layout/news_articles.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Dalam aktivitas Anda, panggil getSupportFragmentManager() untuk mendapatkan FragmentManager menggunakan Support Library API. Lalu panggil beginTransaction() untuk membuat FragmentTransaction dan panggil add() untuk menambahkan fragmen.

Anda dapat melakukan beberapa transaksi fragmen untuk aktivitas menggunakan FragmentTransaction yang sama. Setelah Anda siap melakukan perubahan, Anda harus memanggil commit().

Misalnya, berikut cara menambahkan fragmen ke layout sebelumnya:

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);

        // Check that the activity is using the layout version with
        // the fragment_container FrameLayout
        if (findViewById(R.id.fragment_container) != null) {

            // However, if we're being restored from a previous state,
            // then we don't need to do anything and should return or else
            // we could end up with overlapping fragments.
            if (savedInstanceState != null) {
                return;
            }

            // Create a new Fragment to be placed in the activity layout
            HeadlinesFragment firstFragment = new HeadlinesFragment();

            // In case this activity was started with special instructions from an
            // Intent, pass the Intent's extras to the fragment as arguments
            firstFragment.setArguments(getIntent().getExtras());

            // Add the fragment to the 'fragment_container' FrameLayout
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit();
        }
    }
}

Karena fragmen telah ditambahkan ke kontainerFrameLayout di waktu proses—ketimbang mendefinisikan layout aktivitas dengan elemen <fragment> —aktivitas dapat membuang fragmen dan menggantinya dengan fragmen berbeda.

Mengganti Satu Fragmen dengan Fragmen Lainnya

Prosedur untuk mengganti fragmen serupa dengan menambah fragmen, namun memerlukan metode replace() bukan add().

Perhatikan bahwa saat melakukan transaksi fragmen, misalnya menggantikan atau membuang fragmen, sering kali diperlukan untuk mengizinkan pengguna bernavigasi mundur dan "mengurungkan" perubahan. Untuk mengizinkan pengguna bernavigasi mundur melalui transaksi fragmen, Anda harus memanggil addToBackStack() sebelum Anda mengikat FragmentTransaction.

Catatan: Saat Anda membuang atau mengganti fragmen dan menambahkan transaksi ke back-stack, fragmen yang dibuang akan dihentikan (tidak dihancurkan). Jika pengguna bernavigasi mundur untuk memulihkan fragmen, mulai ulang akan terjadi. Jika Anda tidak menambahkan transaksi ke back-stack, fragmen akan dihancurkan saat dihapus atau digantikan.

Contoh menggantikan satu fragmen dengan fragmen lainnya:

// Create fragment and give it an argument specifying the article it should show
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

Metode addToBackStack() mengambil parameter string opsional yang menentukan nama unik untuk transaksi. Nama tidak diperlukan kecuali Anda melakukan operasi fragmen lanjutan menggunakan FragmentManager.BackStackEntry API.