Pada catatan sebelumnya, ane, menjelaskan menambahkan dua fragment dalam satu activity melalui layout.xml. Kelemahan dalam penerapan tersebut adalah fragment tidak dapat di add, delete dan replace secara dinamik.
Dan, catatan kali ini kita akan mencoba untuk memberikan contoh dalam menambah dan merubah fragment secara dinamik.
Pertama, Buat project baru seperti contoh sebelumnya, yang terdiri dari dua class fragment (FragmentA dan FragmentB) dan dua layout(fragment_a.xml dan fragment_.xml). Ato lebih mudah copy aja class dan layout yang sebelum kita buat dan taruh pada project baru kita.
Selanjutnya
modifikasi activity_main.xml seperti gambar berikut (rincian XML ada dibawah
gambar). Ada dua button dan satu
framelayout. Saat button “FragmentA” ditekan maka frameLayout akan diisi oleh
fragment pertama dan demikian juga dengan button “FragmentB”.
berikut XML pada activiti_main.xml - nya :
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context="com.belajarfragmentdinamis.yonandroid.MainActivity" >;
< Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:onClick="clickFram1"
android:text="FragmentA" />
< FrameLayout
android:id="@+id/fragment_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="5dp"
android:layout_marginTop="101dp" >
< /FrameLayout>
< Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button1"
android:layout_alignBottom="@+id/button1"
android:layout_margin="2dp"
android:layout_toRightOf="@+id/button1"
android:onClick="clickFram2"
android:text="FragmentB" />
< /RelativeLayout >
Untuk menambah
dan menghapus fragment secara dinamik, gunakan FragmentTransaction. Sedangkan untuk
menyimpan history frame agar saat user menekan back kembali ke fragment
sebelumnya, gunakanlah method addToBackStack. Berikut adalah code lengkap untuk
class MainActivity:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.View;
public class MainActivity extends FragmentActivity{
int fragmentAktif;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
return;
}
//buat FragmentA
FragmentA fragA = new FragmentA();
//ambil fragment transactiom, isi fragment_content dengan fragmnet awal
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.fragment_content, fragA).commit();
fragmentAktif = 1;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void clickFram2(View v){
if(fragmentAktif==2){
//karna fragmnet dua sudah aktif jadi tidak perlu melakukan apapa
return;
}
//ganti isi fram_content dengan fram B
FragmentB fragB = new FragmentB();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// ganti isi container dengan fragment 2
// pindahkan fragment sebelumnya ke backstack
transaction.replace(R.id.fragment_content, fragB);
transaction.addToBackStack(null);
transaction.commit();
fragmentAktif = 2;
}
public void clickFram1(View v){
if(fragmentAktif==1){
return;
}
FragmentA fragA = new FragmentA();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_content, fragA);
transaction.addToBackStack(null);
transaction.commit();
fragmentAktif = 1;
}
}
Perlu diingat
bahwa dengan menambahkan ke addToBackStack, fragment akan masuk ke state stop.
Tanpa addToBackStack, fragment akan di-destroy.
Komunikasi Activty ke Fragment
Satu activity
dapat mengandung beberapa fragment, masalahnya bagaimana Activity dapat
berkomunikasi dengan fragment tersebut? atau bagaimana fragment bisa
berkomunikasi satu sama lain?
Untuk komunikasi
dari activity ke fragment, dapat digunakan method findFragmentById() untuk
mendapatkan instance fragment. Setelah itu kita dapat mengakses public method
milik fragment tersebut. Sedangkan untuk mendapatkan instance dari Activity
dapat digunakan getActivity().
Kita akan
modifikasi code pada contoh sebelumnya. Pada layout fragment_a, tambahkan
satu textview di bagian atas, beri nama id tvPesan dan text " Pesan Dari Activity (sepertigambar dibawah)
Update
FragmentA.java, tambahkan public method untuk menulis pesan di text view di
fragment ini, perhatikan penggunaan getView() untuk mendapatkan view fragment:
public void setPesan(String pesan){
TextView tvPesan = (TextView)getView().findViewById(R.id.tvPesan);
tvPesan.setText(pesan);
}
Kemudian pada
layout activiy_main.xml, tambahkan satu
button dengan nama Kirim seperti contoh dibawah :
Selanjutnya update
MainActivity.java, tambahkan event button kirim pesan (perhatikan penggunaan
findFragmentById):
public void clickKirimPesan(View v){
if(fragmentAktif==1){
//ambil fragment yang dicontent
FragmentA fa = (FragmentA)getSupportFragmentManager().findFragmentById(R.id.fragment_content);
//panggil method di fragment tersebut
fa.setPesan("Hai ini Pesan dari FActivity");
}
}
Silahkan diRun dan Click tombol “Kirim” maka akan muncul pesan dari MainActivity.
Oke, Sekian dulu catatan nya..moga-moga yang baca dapat manfaat,
Berikutnya catatannya ane lanjutkan Komunaksi Fragment ke Activity menggunkan tombol FragmentB