Bagikan melalui


Membuat Fragmen

Untuk membuat Fragmen, kelas harus mewarisi dari Android.App.Fragment lalu mengambil alih OnCreateView metode . OnCreateView akan dipanggil oleh Aktivitas hosting ketika saatnya untuk meletakkan Fragmen di layar, dan akan mengembalikan View. Tipikal OnCreateView akan membuat ini View dengan menggelembungkan file tata letak lalu melampirkannya ke kontainer induk. Karakteristik kontainer penting karena Android akan menerapkan parameter tata letak induk ke UI Fragmen. Contoh berikut mengilustrasikan langkah-langkah ini:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    return inflater.Inflate(Resource.Layout.Example_Fragment, container, false);
}

Kode di atas akan mengembang tampilan Resource.Layout.Example_Fragment, dan menambahkannya sebagai tampilan anak ke ViewGroup kontainer.

Catatan

Sub-kelas fragmen harus memiliki default publik tanpa konstruktor argumen.

Menambahkan Fragmen ke Aktivitas

Ada dua cara agar Fragmen dapat dihosting di dalam Aktivitas:

  • Secara deklaratif – Fragmen dapat digunakan secara deklaratif dalam .axml file tata letak dengan menggunakan <Fragment> tag.

  • Secara terprogram – Fragmen juga dapat dibuat secara dinamis dengan menggunakan FragmentManager API kelas.

Penggunaan terprogram melalui FragmentManager kelas akan dibahas nanti dalam panduan ini.

Menggunakan Fragmen Secara Deklaratif

Menambahkan Fragmen di dalam tata letak memerlukan penggunaan <fragment> tag lalu mengidentifikasi Fragmen dengan menyediakan class atribut atau android:name atribut . Cuplikan berikut menunjukkan cara menggunakan class atribut untuk mendeklarasikan fragment:

<?xml version="1.0" encoding="utf-8"?>
<fragment class="com.xamarin.sample.fragments.TitlesFragment"
            android:id="@+id/titles_fragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

Cuplikan berikutnya ini menunjukkan cara mendeklarasikan fragment dengan menggunakan android:name atribut untuk mengidentifikasi kelas Fragmen :

<?xml version="1.0" encoding="utf-8"?>
<fragment android:name="com.xamarin.sample.fragments.TitlesFragment"
            android:id="@+id/titles_fragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

Saat Aktivitas sedang dibuat, Android akan membuat instans setiap Fragmen yang ditentukan dalam file tata letak dan menyisipkan tampilan yang dibuat sebagai OnCreateView pengganti Fragment elemen. Fragmen yang secara deklaratif ditambahkan ke Aktivitas bersifat statis dan akan tetap ada pada Aktivitas sampai dihancurkan; Tidak dimungkinkan untuk mengganti atau menghapus Fragmen tersebut secara dinamis selama masa pakai Aktivitas yang dilampirkan.

Setiap Fragmen harus diberi pengidentifikasi unik:

  • android:id – Seperti halnya elemen UI lain dalam file tata letak, ini adalah ID unik.

  • android:tag – Atribut ini adalah string unik.

Jika tidak satu pun dari dua metode sebelumnya digunakan, maka Fragmen akan mengasumsikan ID tampilan kontainer. Dalam contoh berikut di mana tidak android:id ada atau android:tag disediakan, Android akan menetapkan ID fragment_container ke Fragmen:

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

        <fragment class="com.example.android.apis.app.TitlesFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
</LinearLayout>

Kasus Nama Paket

Android tidak mengizinkan karakter huruf besar dalam nama paket; ini akan melemparkan pengecualian saat mencoba mengembang tampilan jika nama paket berisi karakter huruf besar. Namun, Xamarin.Android lebih memaafkan, dan akan mentolerir karakter huruf besar di namespace.

Misalnya, kedua cuplikan berikut akan berfungsi dengan Xamarin.Android. Namun, cuplikan kedua akan menyebabkan dilemparkan android.view.InflateException oleh aplikasi Android murni berbasis Java.

<fragment class="com.example.DetailsFragment" android:id="@+id/fragment_content" android:layout_width="match_parent" android:layout_height="match_parent" />

ATAU

<fragment class="Com.Example.DetailsFragment" android:id="@+id/fragment_content" android:layout_width="match_parent" android:layout_height="match_parent" />

Siklus Hidup Fragmen

Fragmen memiliki siklus hidup mereka sendiri yang agak independen, tetapi masih terpengaruh oleh, siklus hidup Aktivitas hosting. Misalnya, saat Aktivitas dijeda, semua Fragmen terkait dijeda. Diagram berikut menguraikan siklus hidup Fragmen.

Flow diagram illustrating the Fragment lifecycle

Metode Siklus Hidup Pembuatan Fragmen

Daftar di bawah ini menunjukkan alur berbagai panggilan balik dalam siklus hidup Fragmen saat sedang dibuat:

  • OnInflate() – Dipanggil saat Fragmen sedang dibuat sebagai bagian dari tata letak tampilan. Ini dapat dipanggil segera setelah Fragmen dibuat secara deklaratif dari file tata letak XML. Fragmen belum dikaitkan dengan Aktivitasnya, tetapi Aktivitas, Bundel, dan Set Atribut dari hierarki tampilan diteruskan sebagai parameter. Metode ini paling baik digunakan untuk mengurai AttributeSet dan untuk menyimpan atribut yang mungkin digunakan nanti oleh Fragmen.

  • OnAttach() – Dipanggil setelah Fragmen dikaitkan dengan Aktivitas. Ini adalah metode pertama yang dijalankan ketika Fragmen siap digunakan. Secara umum, Fragmen tidak boleh mengimplementasikan konstruktor atau mengambil alih konstruktor default. Komponen apa pun yang diperlukan untuk Fragmen harus diinisialisasi dalam metode ini.

  • OnCreate() – Dipanggil oleh Aktivitas untuk membuat Fragmen. Ketika metode ini dipanggil, hierarki tampilan Aktivitas hosting mungkin tidak sepenuhnya dibuat, sehingga Fragmen tidak boleh mengandalkan bagian apa pun dari hierarki tampilan Aktivitas sampai nanti dalam siklus hidup Fragmen. Misalnya, jangan gunakan metode ini untuk melakukan penyesuaian atau penyesuaian pada UI aplikasi. Ini adalah waktu paling awal di mana Fragmen dapat mulai mengumpulkan data yang dibutuhkan. Fragmen berjalan di utas UI pada saat ini, jadi hindari pemrosesan yang panjang, atau lakukan pemrosesan tersebut pada utas latar belakang. Metode ini dapat dilewati jika SetRetainInstance(true) dipanggil. Alternatif ini akan dijelaskan secara lebih rinci di bawah ini.

  • OnCreateView() – Membuat tampilan untuk Fragmen. Metode ini disebut setelah metode OnCreate() Aktivitas selesai. Pada titik ini, aman untuk berinteraksi dengan hierarki tampilan Aktivitas. Metode ini harus mengembalikan tampilan yang akan digunakan oleh Fragmen.

  • OnActivityCreated() – Dipanggil setelah Activity.OnCreate telah diselesaikan oleh Aktivitas hosting. Tweak akhir ke antarmuka pengguna harus dilakukan saat ini.

  • OnStart() – Dipanggil setelah Aktivitas yang berisi dilanjutkan. Ini membuat Fragmen terlihat oleh pengguna. Dalam banyak kasus, Fragmen akan berisi kode yang jika tidak berada dalam metode OnStart() aktivitas.

  • OnResume() – Ini adalah metode terakhir yang disebut sebelum pengguna dapat berinteraksi dengan Fragmen. Contoh jenis kode yang harus dilakukan dalam metode ini adalah mengaktifkan fitur perangkat yang dapat berinteraksi dengan pengguna, seperti kamera tempat layanan lokasi. Namun, layanan seperti ini dapat menyebabkan pengurasan baterai yang berlebihan, dan aplikasi harus meminimalkan penggunaannya untuk mempertahankan masa pakai baterai.

Metode Siklus Hidup Penghancuran Fragmen

Daftar berikutnya menjelaskan metode siklus hidup yang disebut sebagai Fragmen sedang dihancurkan:

  • OnPause() – Pengguna tidak lagi dapat berinteraksi dengan Fragmen. Situasi ini ada karena beberapa operasi Fragmen lainnya memodifikasi Fragmen ini, atau Aktivitas hosting dijeda. Ada kemungkinan bahwa Aktivitas yang menghosting Fragmen ini mungkin masih terlihat, yaitu Aktivitas yang berfokus sebagian transparan atau tidak menempati layar penuh. Ketika metode ini menjadi aktif, ini adalah indikasi pertama bahwa pengguna meninggalkan Fragmen. Fragmen harus menyimpan perubahan apa pun.

  • OnStop() – Fragmen tidak lagi terlihat. Aktivitas host dapat dihentikan, atau operasi Fragmen memodifikasinya di Aktivitas. Panggilan balik ini melayani tujuan yang sama dengan Activity.OnStop.

  • OnDestroyView() – Metode ini dipanggil untuk membersihkan sumber daya yang terkait dengan tampilan. Ini dipanggil ketika tampilan yang terkait dengan Fragmen telah dihancurkan.

  • OnDestroy() – Metode ini dipanggil ketika Fragmen tidak lagi digunakan. Ini masih dikaitkan dengan Aktivitas, tetapi Fragmen tidak lagi berfungsi. Metode ini harus merilis sumber daya apa pun yang digunakan oleh Fragmen, seperti SurfaceView yang mungkin digunakan untuk kamera. Metode ini dapat dilewati jika SetRetainInstance(true) dipanggil. Alternatif ini akan dijelaskan secara lebih rinci di bawah ini.

  • OnDetach() – Metode ini dipanggil tepat sebelum Fragmen tidak lagi terkait dengan Aktivitas. Hierarki tampilan Fragmen tidak ada lagi, dan semua sumber daya yang digunakan oleh Fragmen harus dirilis pada saat ini.

Menggunakan SetRetainInstance

Dimungkinkan bagi Fragmen untuk menentukan bahwa fragmen tersebut tidak boleh sepenuhnya dihancurkan jika Aktivitas sedang dibuat ulang. Kelas Fragment menyediakan metode SetRetainInstance untuk tujuan ini. Jika true diteruskan ke metode ini, maka ketika Aktivitas dimulai ulang, instans Fragmen yang sama akan digunakan. Jika ini terjadi, maka semua metode panggilan balik akan dipanggil kecuali OnCreate panggilan balik siklus hidup dan OnDestroy . Proses ini diilustrasikan dalam diagram siklus hidup yang ditunjukkan di atas (oleh garis putus-putus hijau).

Manajemen Status Fragmen

Fragmen dapat menyimpan dan memulihkan statusnya selama siklus hidup Fragmen dengan menggunakan instans Bundle. Bundel memungkinkan Fragmen untuk menyimpan data sebagai pasangan kunci/nilai dan berguna untuk data sederhana yang tidak memerlukan banyak memori. Fragmen dapat menyimpan statusnya dengan panggilan ke OnSaveInstanceState:

public override void OnSaveInstanceState(Bundle outState)
{
    base.OnSaveInstanceState(outState);
    outState.PutInt("current_choice", _currentCheckPosition);
}

Ketika instans baru Fragmen dibuat, status yang disimpan di Bundle akan tersedia untuk instans baru melalui OnCreatemetode , OnCreateView, dan OnActivityCreated instans baru. Sampel berikut menunjukkan cara mengambil nilai current_choice dari Bundle:

public override void OnActivityCreated(Bundle savedInstanceState)
{
    base.OnActivityCreated(savedInstanceState);
    if (savedInstanceState != null)
    {
        _currentCheckPosition = savedInstanceState.GetInt("current_choice", 0);
    }
}

Penimpaan OnSaveInstanceState adalah mekanisme yang sesuai untuk menyimpan data sementara dalam Fragmen di seluruh perubahan orientasi, seperti current_choice nilai dalam contoh di atas. Namun, implementasi OnSaveInstanceState default mengurus penyimpanan data sementara di UI untuk setiap tampilan yang memiliki ID yang ditetapkan. Misalnya, lihat aplikasi yang memiliki elemen yang EditText didefinisikan dalam XML sebagai berikut:

<EditText android:id="@+id/myText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

EditText Karena kontrol memiliki id yang ditetapkan, Fragmen secara otomatis menyimpan data di widget saat OnSaveInstanceState dipanggil.

Batasan Bundel

Meskipun menggunakan OnSaveInstanceState memudahkan untuk menyimpan data sementara, penggunaan metode ini memiliki beberapa batasan:

  • Jika Fragmen tidak ditambahkan ke tumpukan belakang, maka statusnya tidak akan dipulihkan saat pengguna menekan tombol Kembali .

  • Saat Bundel digunakan untuk menyimpan data, data tersebut diserialisasikan. Ini dapat menyebabkan penundaan pemrosesan.

Berkontribusi pada Menu

Fragmen dapat menyumbangkan item ke menu Aktivitas hosting mereka. Aktivitas menangani item menu terlebih dahulu. Jika Aktivitas tidak memiliki handler, maka peristiwa akan diteruskan ke Fragmen, yang kemudian akan menanganinya.

Untuk menambahkan item ke menu Aktivitas, Fragmen harus melakukan dua hal. Pertama, Fragmen harus menerapkan metode OnCreateOptionsMenu dan menempatkan itemnya ke dalam menu, seperti yang ditunjukkan dalam kode berikut:

public override void OnCreateOptionsMenu(IMenu menu, MenuInflater menuInflater)
{
    menuInflater.Inflate(Resource.Menu.menu_fragment_vehicle_list, menu);
    base.OnCreateOptionsMenu(menu, menuInflater);
}

Menu dalam cuplikan kode sebelumnya ditambah dari XML berikut, yang terletak di file menu_fragment_vehicle_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/add_vehicle"
        android:icon="@drawable/ic_menu_add_data"
        android:title="@string/add_vehicle" />
</menu>

Selanjutnya, Fragmen harus memanggil SetHasOptionsMenu(true). Panggilan ke metode ini mengumumkan ke Android bahwa Fragmen memiliki item menu untuk berkontribusi pada menu opsi. Kecuali panggilan ke metode ini dilakukan, item menu untuk Fragmen tidak akan ditambahkan ke menu opsi Aktivitas. Ini biasanya dilakukan dalam metode OnCreate()siklus hidup , seperti yang ditunjukkan dalam cuplikan kode berikutnya:

public override void OnCreate(Bundle savedState)
{
    base.OnCreate(savedState);
    SetHasOptionsMenu(true);
}

Layar berikut menunjukkan tampilan menu ini:

Example screenshot of My Trips app displaying menu items