03 Maret 2012

Membuat Fragment

Untuk membuat sebuah fragment, kita harus membuat sebuah subclass dari Fragment (atau subclass yang ada). Class Fragment memiliki kode yang banyak kesamaannya dengan sebuah Activity. Dalam kode tersebut terkandung metode callback serupa dengan activity, misalnya onCreate(), onStart(), onPause(), dan onStop(). Faktanya, jika kita ingin mengkonversi aplikasi android untuk menggunakan fragment, mungkin kita cukup memindahkan kode dari metode callback activity ke dalam metode callback dari masing-masing fragment.

Biasanya, kita harus mengimplementasikan paling tidak metode siklus hidup berikut:

  1. onCreate()
  2. Sistem memanggil metode ini pada saat membuat fragment. Dalam implementasinya, kita sebaiknya menginisialisasikan komponen penting dari fragment yang ingin kita jaga ketika fragment tersebut di pause, atau distop, kemudian di resume.
  3. onCreateView()
  4. Sistem memanggil metode ini ketika tiba saatnya bagi fragment untuk menggambar UI-nya untuk pertama kali. untuk menggambar sebuah UI fragment, kita harus me-return sebuah view dari metode ini yang menjadi "root" layout milik fragment. kita bisa return null jika fragment tidak menyediakan sebuah UI.
  5. onPause()
  6. Sistem menamggil metode ini sebagai indikasi pertama bahwa user meninggalkan fragment (meskipun tidak selalu berarti bahwa fragment dihapus). Di sinilah biasanya dimana kita harus menyimpan perubahan yang ingin dijaga setelah sesi user yang sekarang (karena user mungkin tidak kembali).

Sebagian besar aplikasi menerapkan minimal tiga metode tersebut untuk setiap fragment, tapi ada beberapa metode callback lain yang sebaiknya kita gunakan untuk meng-handle tahapan-tahapan yang bervariasi dari siklus hidup fragment.

Selain metode, juga terdapat beberapa subclass yang mungkin bisa kita turunkan, selain class dasar Fragment.

  1. DialogFragment
  2. Menampilkan sebuah dialog mengapung. Menggunakan class ini untuk membuat sebuah dialog merupakan pilihan yang bagus untuk menggunakan metode bantuan dialog dalam class Activity, karena kita bisa menggabungkan sebuah fragment dialog ke dalam backstack fragment yang di-manage oleh activity, sehingga user bisa kembali ke fragment yang sudah ditinggalkan.
  3. ListFragment
  4. Menampilkan sebuah daftar item yang di-manage oleh adapter (misalnya sebuah SimpleCursorAdapter), serupa dengan ListActivity. Class ini menyediakan beberapa metode untuk me-manage sebuah tampilan daftar, misalnya callback onListItemClick() untuk meng-handle event klik.
  5. PreferenceFragment
  6. Menampilkan hierarki sebuah obyek Preference dalam bentuk daftar, serupa dengan PreferenceActivity. Class ini sangat bermanfaat ketika membuat sebuah activity "setting" untuk aplikasi kita.

Gambar direferensi dari halaman: http://developer.android.com/guide/topics/fundamentals/fragments.html

Menambahkan user interface pada fragment

Sebuah fragment biasanya digunakan sebagai bagian dari UI activity dan memberikan layputnya ke activity. Untuk membuat layout sebuah fragment, kita harus menerapkan metode callback onCreateView(), yang mana dipanggil sistem Android ketika tiba saatnya fragment menggambar layoutnya. Implementasi metode ini harus me-return sebuah View yang menjadi root dari layout fragment.

Note: Jika fragment kita adalah sebuah subclass dari ListFragment, implementasi default me-return sebuah ListView dari onCreateView(), jadi kita tidak perlu mengimplementasikannya

Untuk me-return sebuah layout dari onCreateView(), kita bisa mengembangkannya dari sumberdaya layout yang didefinisikan di XML. Untuk membantu kita, onCreateView() menyediakan sebuah obyek LayoutInflater obyek.

Sebagai contoh, berikut ini adalah sebuah subclass dari Fragment yang me-load sebuah layout dari file contoh_fragment.xml:

public static class ContohFragment extends Fragment {
 @Override
 public View onCreateView()(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  // Mengembangkan layout untuk fragment ini
  return inflater.inflate(R.layout.contoh_fragment, container, false);
 }
}

Parameter container yang dioperkan ke onCreateView() adalah ViewGroup "parent" yang merupakan tempat layout fragment dimasukan. Parameter savedInstanceState merupakan sebuah Bundle yang menyediakan data mengenai state fragment sebelumnya, jika fragment di-resume.

Metode inflate() mengambil tiga parameter (argument):

  • ID sumberdaya dari layout yang ingin kita inflate.
  • ViewGroup yang akan menjadi dari layout yang di-inflate. Mengoperkan container sangat penting agar sistem bisa menerapkan parameter layout ke tampilan root dari layout yang di-inflate, diterangkan oleh tampilan parent yang sedang berjalan.
  • Sebuah boolean yang mengindikasikan apakah layout yang di-inflate harus menempel ke ViewGroup (parameter kedua) selama proses inflate. Dalam kasus ini, nilainya adalah false karena sistem sudah memasukan layout yang di-inflate ke container, mengoperkan true akan menyebabkan sebuah redudansi group tampilan di layout akhir.
Setelah kita membuat fragment yang menyediakan layout, berikutnya adalah belajar menambahkan fragment ke activity.

Menambahkan fragment ke activity

Biasanya, sebuah fragment menyumbang sebuah UI ke activity, yang mana tertanam sebagai bagian dari keseluruhan hierarki tampilan activity. Ada dua cara untuk menambahkan fragment ke layout activity:

  • Deklarasi fragment di dalam file layout activity.
  • Dalam hal ini, kita bisa menspesifikasikan properti layout sebagai sebuah tampilan biasa. Seperti contoh, berikut ini adalah file layout untuk activity dengandua fragment

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <fragment android:name="org.pupil.learnfragment.news.AcrticleListFragment"
            android:id="@+id/list"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent" />
        <fragment android:name="org.pupil.learnfragment.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>
    Atribut Android:name dalam <fragment> menspesifikasikan class Fragment agar melakukan instansiasi layout

    Ketika sistem membuat layout activity ini, sistem menginstansiasi setiap fragment yang dispesifikasikan dalam layout dan memanggil metode onCreateView() untuk masing-masing fragment, agar mendapatkan masing-masing layout fragment. Sistem memasukan View yang di-return oleh fragment secara langsung menggantikan elemen <fragment>.

    Catatan: Setiap fragment membutuhkan sebuah identifier yang unik yang bisa digunakan sistem untuk me-restore fragment jika activity di jalankan kembali. Selain itu juga bisa kita gunakan untuk meng-capture fragment untuk melakukan transaksi, misalnya menghapus fragment. Ada tiga cara untuk menyediakan ID bagi sebuah fragment:
    • Memberikan atribut android:id dengan ID yang unik.
    • Memberikan atribut android:tag dengan string yang unik
    • Jika kita memberikan keduanya, sistem menggunakan ID sebagai penampung tampilan.

  • Atau, menambahkan fragment ke ViewGroup yang sudah ada menggunakan program
  • Kapanpun ketika activity berjalan, kita bisa menambahkan fragment ke layout activity . Kita cukup menspesifikasikan sebuah ViewGroup yang akan menjadi tempat fragment. Untuk membuat transaksi fragment di dalam activity (misalnya menambah, menghapus atau mengganti fragment), kita harus menggunakan API dari FragmentTransaction. Kita bisa mendapatkan instansi FragmentTransaction dari Activity sebagai berikut:
    FragmentManager managerFragment = getFragmentManager();
    FragmentTransaction transaksiFragment = managerFragment.beginTransaction();
    kemudian kita bisa menambahkan sebuah fragment menggunakan metode add(), memberikan spesifikasi fragment yang ingin ditambahkan dan tampilan fragment. Sebagai contoh:
    ContohFragment fragment = new ContohFragment();
    transaksiFragment.add(R.id.fragment_container, fragment);
    transaksiFragment.commit()
    Argument pertama yang dioperkan ke add() adalah ViewGroup dimana fragment ditempatkan, dispesifikasikan oleh ID sumberdaya, dan parameter kedua adalah fragment yang akan ditambahkan. Setelah kita membuat perubahan dengan FragmentTransaction, kita harus memanggil commit() agar dapat dirasakan efek perubahannya.

Menambahkan fragment tanpa User Interface

Contoh di atas menunjukan cara untuk menambahkan sebuah fragment ke activity dengan UI. Namun, kita juga bisa menggunakan fragment untuk menyediakan sebuah perilaku background pada activity tanpa memiliki tambahan UI.

untuk menambahkan sebuah fragment tanpa UI, tambahkan fragment tersebut menggunakan add(Fragment, String) (memberikan sebuah string sebagai "label" untuk fragment, bukannya sebuah ID tampilan). Dengan begini, fragment tetap ditambahkan, tapi karena tidak berhubungan dengan sebuah tampilan di layout activity, metode ini tidak akan memanggil onCreateView(). Jadi kita tidak perlu menerapkan metode ini.

Memberikan sebuah label pada fragment, tidak semata-mata hanya untuk fragment non-UI, kita juga bisa memberikan label ke fragment yang memiliki UI, tapi jika fragment tidak memiliki UI, maka hanya label satu-satunya cara untuk mengidentifikasikan fragment. Jika nantinya kita ingin menggunakan fragment pada activity, kita perlu menggunakan findFragmentBytag().



3 komentar:

  1. Apaaaa inii? Saya nggak ngerti blas.

    Sudah saya duga, bukan sembarangan :D Saya senang melihat kemajuan akang. Wiiiih, Android dan Ubuntu, ya? Terima kasih, Kang.

    Kalau saya, masih nggak maju-maju. Tenang aja, Kang.

    BalasHapus
  2. Ente yang suka rendah hati, bro. Kemampuan saya masih jauh dari yang saya harapkan.

    BalasHapus
  3. bagus kang,, lanjutkan

    BalasHapus