Sunday, February 8, 2015

Belajar Android - Komunikasi Activity ke Fragment ( Dinamik )

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

0 komentar: