Fragment LifeCycle
Ada beberapa state yang perlu kita ketahui sebelum menggunakan fragment.
Resumed
Fragment bisa dilihat ketika activity sedang berjalan.
Paused
Ketika ada activity lain yang menutupi sebagian dari activity dimana fragment
ditambahkan. Yang dimaksud menutupi sebagian adalah ketika activity-nya tidak
tertutup sepenuhnya oleh activity lain. Jadi masih ada bagian dari activity yang
masih bisa bisa dilihat di layar.
Stopped
Ketika fragment tidak kelihatan di layar. Bisa jadi karena activity dimana fragment
itu ditambahkan berhenti atau bahkan fragment itu sendiri sudah dihapus dari
activity. Pada kondisi ini fragment masih hidup dengan semua informasinya.
Akan tetapi sudah tidak kelihatan di layar dan akan dihancurkan.
Skema di bawah ini menunjukkan callback method apa saja yang akan dipanggil di
dalam fragment ketika terjadi perubahan pada sebuah activity.
Skema di atas menunjukkan bahwa perubahan state dari sebuah activity akan
mempengaruhi life cycledari sebuah fragment. Ini karena fragment merupakan
komponen view yang bisa ditambahkan (embed) ke dalam activity.
Untuk tahu lebih detail tentang fragment silakan kamu pahami baik-baik materi di link
ini:
Fragments
Tujuan
Agar Anda dapat lebih memahami topik fragment, akan ada beberapa codelab yang
akan Anda lakukan.
Melakukan klik ke button → memanggil fragment atau aktivity dengan atau tanpa data
→ menampilkan activity atau fragment yang dituju
Codelab
2.
3. Pada activity_main.xml, silakan kondisikan kode pada berkas tersebut menjadi
seperti berikut :
1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent"
5. android:orientation="vertical"
6. tools:context="com.dicoding.picodiploma.myflexiblefragment.HomeFragm
ent">
7.
8. <TextView
9. android:layout_width="match_parent"
10. android:layout_height="wrap_content"
11. android:layout_marginBottom="@dimen/activity_vertical_margin"
12. android:layout_marginLeft="@dimen/activity_horizontal_margin"
13. android:layout_marginRight="@dimen/activity_horizontal_margin"
14. android:layout_marginTop="@dimen/activity_vertical_margin"
15. android:text="@string/hello_home_fragment" />
16.
17. <Button
18. android:id="@+id/btn_category"
19. android:layout_width="match_parent"
20. android:layout_height="wrap_content"
21. android:layout_marginLeft="@dimen/activity_horizontal_margin"
22. android:layout_marginRight="@dimen/activity_horizontal_margin"
23. android:text="@string/to_category" />
24. </LinearLayout>
Akan ada yang eror pada bagian android:text .Seperti pada modul sebelumnya
kita perlu menambahkan resource string-nya.
25. <resources>
26. <string name="app_name">MyFlexibleFragment</string>
27.
28. <string name="hello_blank_fragment">Hello blank fragment</string>
29. <string name="this_profile">Ini activity Profile</string>
30. <string name="this_category">Ini fragment Category</string>
31. <string name="category_lifestyle">Ke fragment Lifestyle</string>
32. <string name="category_name">Category Name</string>
33. <string name="category_description">Category Description</string>
34. <string name="to_profile">Ke Halaman Profile Activity</string>
35. <string name="show_dialog">Tampilkan sebuah dialog</string>
36. <string name="hello_home_fragment">Hello Ini Home Fragment</string>
37. <string name="to_category">Ke fragment Category</string>
38. <string name="question_coach">Siapa pelatih tersukses Machester Unit
ed?</string>
39. <string name="sir_alex_ferguson">Sir Alex Ferguson</string>
40. <string name="jose_mourinho">Jose Mourinho</string>
41. <string name="louis_van_gaal">Louis Van Gaal</string>
42. <string name="david_moyes">David Moyes</string>
43. <string name="choose">Pilih</string>
44. <string name="close">Tutup</string>
45. </resources>
Resource string ini akan kita gunakan selama latihan fragment.
Jangan lupa untuk menambahkan berkas dimens.xml secara manual di
dalam res → values. Dan isikan berkas dimens.xml seperti berikut.
46. <resources>
47. <!-- Default screen margins, per the Android Design guidelines. -->
48. <dimen name="activity_horizontal_margin">16dp</dimen>
49. <dimen name="activity_vertical_margin">16dp</dimen>
50. </resources>
7. Pada HomeFragment.java lakukan penyesuaian kode sebagai berikut:
Di sini kita juga siapkan kode listener onclick. Listener di sini akan kita gunakan
pada latihan berikutnya.
1. ...
2.
3. @Override
4. protected void onCreate(Bundle savedInstanceState) {
5. super.onCreate(savedInstanceState);
6. setContentView(R.layout.activity_main);
7.
8. FragmentManager mFragmentManager = getSupportFragmentManager();
9. FragmentTransaction mFragmentTransaction = mFragmentManager.beginTra
nsaction();
10. HomeFragment mHomeFragment = new HomeFragment();
11.
12. Fragment fragment = mFragmentManager.findFragmentByTag(HomeFragment.
class.getSimpleName());
13. if (!(fragment instanceof HomeFragment)) {
14. mFragmentTransaction.add(R.id.frame_container, mHomeFragment, Ho
meFragment.class.getSimpleName());
15. Log.d("MyFlexibleFragment", "Fragment Name :" + HomeFragment.cla
ss.getSimpleName());
16. mFragmentTransaction.commit();
17. }
18. }
19.
20. ...
Untuk mengatasi tanda merah pada class, jangan lupa untuk tekan (Alt + Enter)
untuk import kelas secara otomatis. Beberapa package yang seharusnya di-
import adalah seperti di bawah ini.
Bedah Kode
FrameLayout
Dengan karakteristik seperti ini, FrameLayout merupakan sebuah layout yang paling
optimal dalam proses manipulasi penampilan obyek fragment ke layar pengguna.
OnCreateView
OnViewCreated
1. @Override
2. public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceSt
ate) {
3. super.onViewCreated(view, savedInstanceState);
4. Button btnCategory = view.findViewById(R.id.btn_category);
5. btnCategory.setOnClickListener(this);
6. }
Inflate di Fragment
Isian dari tiga parameter yang terdapat pada metode inflate() berdasarkan dari :
Bacaan berikut akan memberi wawasan yang lebih dalam tentang proses inflate sebuah
layout:
Inflate Layout
Secara default, attachToRoot bernilai false. Jadi kita hanya inginkan mengubah layout
xml kedalam bentuk obyek view.
Sedikit berbeda pada proses casting view dari sebuah ID di dalam layout xml, di sini
casting obyek Buttondilakukan dengan view.findViewById(R.id.btn_category). Kode
tersebut menandakan btn_categoryberada pada obyek view di mana obyek view
berasal dari konversi fragment_home.xml. Bila hanya findViewById(R.id.btn_category),
maka btn_category berada pada root layout, activity_main.xml.
FragmentTransaction
Di sini kita menggunakan kelas FragmentManager yang berasal dari Android Support
Library v4, agar bisa kompatibel ke versi Android sebelumnya (Backward Compability).
Fragment Manager
Fragment Transaction
1. mFragmentTransaction.commit();
Selanjutnya, kita akan membuat sebuah fragment lagi untuk melihat bagaimana sebuah
tampilan bisa dengan fleksibel berubah di dalam satu activity, tanpa berpindah
halaman.