Memahami Siklus Hidup Fragment

Sama seperti activity, fragment memiliki siklus hidup mereka sendiri. Dengan memahami siklus hidup fragment kita bisa dengan tepat menyimpan instans fragment bila di-destroy, dan me-restore lagi ke status sebelumnya ketika dibuat ulang.

Berikut adalah contoh latihan supaya mudah memahami siklus hidup fragment.

1. Kita masih menggunakan project latihan sebelumnya dan kemudian kita tambahkan kode berikut ke file "Fragment1.java" seperti berikut:
package com.example.fragments;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {

Log.d("Fragment 1", "onCreateView");

/*tampilkan layout untuk fragment ini*/
return inflater.inflate(R.layout.fragment1, container, false);
}

@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.d("Fragment 1", "onAttach");
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("Fragment 1", "onCreate");
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d("Fragment 1", "onActivityCreated");
}

@Override
public void onStart() {
super.onStart();
Log.d("Fragment 1", "onStart");
}

@Override
public void onResume() {
super.onResume();
Log.d("Fragment 1", "onResume");
}

@Override
public void onPause() {
super.onPause();
Log.d("Fragment 1", "onPause");
}

@Override
public void onStop() {
super.onStop();
Log.d("Fragment 1", "onStop");
}

@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("Fragment 1", "onDestroyView");
}

@Override
public void onDestroy() {
super.onDestroy();
Log.d("Fragment 1", "onDestroy");
}

@Override
public void onDetach() {
super.onDetach();
Log.d("Fragment 1", "onDetach");
}
}
2. Jalankan emulator di Android Studio kemudian kita ganti ke mode landscape.

3. Ketika app muncul di emulator kita akan melihat di jendela Log seperti berikut:
D/Fragment 1: onAttach
D/Fragment 1: onCreate
D/Fragment 1: onCreateView
D/Fragment 1: onActivityCreated
D/Fragment 1: onStart
D/Fragment 1: onResume
4. Kemudian kita tekan tombol 'Home' di emulator. jendela Log akan menampilkan seperti berikut:
D/Fragment 1: onPause
D/Fragment 1: onStop
5. Kemudian cari dan tekan lagi ikon app untuk mengaktifkan app. Di jendela Log akan muncul seperti berikut:
D/Fragment 1: onStart
D/Fragment 1: onResume
6. Terakhir, kita klik tombol 'Back' di emulator. Sekarang di jendela Log akan muncul seperti berikut:
D/Fragment 1: onPause
D/Fragment 1: onStop
D/Fragment 1: onDestroyView
D/Fragment 1: onDestroy
D/Fragment 1: onDetach

Penjelasan:

Sama seperti activity, fragment di Android juga punya siklus hidupnya sendiri. Seperti yang baru saja kita lihat, ketika fragment dibuat, fragment akan melalui status-status seperti berikut:
  • onAttach()
  • onCreate()
  • onCreateView()
  • onActivityCreated()
Ketika fragment muncul di layar dan terlihat oleh user, fragment akan melalui status-status seperti berikut:
  • onStart()
  • onResume()
Ketika fragment berada di background, fragment akan melalui status-status seperti berikut:
  • onPause()
  • onStop()
Ketika fragment di-destroy (bila activity yang sedang aktif yang menjadi induknya di-destroy), fragment akan melalui status-status seperti berikut:
  • onPause()
  • onStop()
  • onDestroyView()
  • onDestroy()
  • onDetach()
Sama seperti activity, kita juga bisa me-restore instans suatu fragment dengan menggunakan object 'Bundle', dalam status berikut:
  • onCreate()
  • onCreateView()
  • onActivityCreated()

Catatan:
Kita bisa menyimpan status fragment dalam method 'onSaveInstanceState()'. Kita akan mempelajarinya dalam latihan yang lain.
Sebagian besar status yang dialami suatu fragment sangat mirip dengan siklus hidup suatu activity. Tetapi beberapa status hanya khusus berlaku untuk fragment:
  • onAttach() - dipanggil ketika fragment sudah terasosiasi dengan activity
  • onCreateView() - dipanggil untuk menciptakan view untuk fragment tersebut
  • onActivityCreated() - dipanggil ketika method 'onCreate()' dari activity sudah dikembalikan/dihasilkan
  • onDestroyView() - dipanggil bila view dari fragment dihilangkan/removed
  • onDetach() - dipanggil ketika fragment dilepaskan dari activity

Harap diperhatikan bahwa salah satu perbedaan utama antara activity dan fragment adalah: ketika activity menuju ke background, activity ditaruh di tumpukan belakang. Hal ini membuat activity bisa di-resume (dilanjutkan lagi) ketika user menekan tombol 'Back'. Tetapi untuk fragment tidaklah otomatis ditaruh di tumpukan belakang ketika menuju ke background. Sebaliknya, untuk menaruh fragment ke tumpukan belakang, kita perlu secara eksplisit memanggil method 'addToBackStack()' selama tarnsaksi fragment, seperti berikut:
/*ambil info tentang layar yang digunakan*/
WindowManager wm = getWindowManager();
Display d = wm.getDefaultDisplay();
Point size = new Point();
d.getSize(size);

if (size.x > size.y) {
/*mode landscape*/
Fragment1 fragment1 = new Fragment1();
/*android.R.id.Content akan mengacu ke content view activity tersebut*/
fragmentTransaction.replace(android.R.id.content,fragment1);
}
else
{
/*mode portrait*/
Fragment2 fragment2 = new Fragment2();
fragmentTransaction.replace(android.R.id.content, fragment2);
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

Kode tersebut akan memastikan bahwa setelah fragment ditambahkan ke activity, user bisa me-klik tombol 'Back' untuk menyingkirkannya.

No comments: