Interaksi antar Fragment

Seringkali, suatu activity berisi satu atau lebih fragment yang bekerjasama untuk menampilkan UI yang saling berkaitan. Dalam hal ini, sangatlah penting bagi fragment untuk berkomunikasi satu sama lain dan saling bertukar data. Misalnya, satu fragment akan berisi satu daftar item (misalkan posting dari RSS Feed) dan bila user men-tap pada salah satu item dalam fragment tersebut, maka detil-detil tentang item yang dipilih akan ditampilkan di fragment yang lain.

Berikut di bawah ini adalah latihan bagaimana satu fragment bisa mengakses 'view' yang ada di fragment yang lain.

1. Kita masih menggunakan project yang sama dengan latihan sebelumnya, dan kita tambahkan kode berikut dalam file "Fragment1.xml":
<?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"
android:background="#00FF00">

<TextView
android:id="@+id/lblFragment1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Ini adalah fragment #1"
android:textColor="#000000"
android:textSize="25sp"/>

</LinearLayout>

2. Kemudian kita tambahkan baris kode berikut dalam file "Fragment2.xml":
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFE00">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Ini adalah fragment #2"
android:textColor="#000000"
android:textSize="25sp"/>

<Button
android:id="@+id/btnGetText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ambil teks di Fragment #1"
android:textColor="#000000"
android:onClick="onClick"
/>

</LinearLayout>
3. Letakkan kembali kedua fragment dalam file layout "activity_main.xml" (lepaskan tanda komentar yang dibuat dalam latihan sebelumnya), seperti berikut:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.example.fragments.MainActivity">

<fragment
android:name="com.example.fragments.Fragment1"
android:id="@+id/fragment1"
android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent" />
<fragment
android:name="com.example.fragments.Fragment2"
android:id="@+id/fragment2"
android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent" />


</LinearLayout>
4. Kita modifikasi file "MainActivity.java" dengan men-komentar-kan (menaruh tanda komentar) pada kode yang kita tambahkan dalam latihan sebelumnya, seperti berikut:
package com.example.fragments;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

//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);
}

// taruh ke stumpukan belakang
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
*/
}
}
5. Kita tambahkan kode berikut dalam file "Fragment2.java":
package com.example.fragments;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class Fragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
/* tampilkan layout utk fragment ini*/
return inflater.inflate(R.layout.fragment2, container, false);
}

@Override
public void onStart() {
super.onStart();
/* Button view */
Button btnGetText = (Button) getActivity().findViewById(R.id.btnGetText);
btnGetText.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
TextView lbl = (TextView) getActivity().findViewById(R.id.lblFragment1);
Toast.makeText(getActivity(), lbl.getText(), Toast.LENGTH_SHORT).show();
}
});
}
}
6. Kita jalankan di emulator Android Studio. Pada fragment kedua di sebelah kanan, silahkan klik tombolnya. Kita seharusnya akan melihat class 'Toast' yang menampilkan teks "Ini adalah frament #1".

Interaksi antar Fragment
Penjelasan:

Karena fragment ditempelkan di dalam activity, maka kita bisa mendapatkan activity dimana fragment ditempelkan dengan menggunakan method 'getActivity()' dan kemudian dengan menggunakan method 'findViewById()' untuk menemukan 'view' yang ada di dalam fragment:
TextView lbl = (TextView) getActivity().findViewById(R.id.lblFragment1);
Toast.makeText(getActivity(), lbl.getText(), Toast.LENGTH_SHORT).show();
Method 'getActivity()' akan mengembalikan 'activity' dimana fragment saat itu sedang terkait.

Atau sebagai alternatifnya, kita juga bisa menambahkan method berikut ke file "MainActivity.java":
public void onClick(View v) {
TextView lbl = (TextView) getActivity().findViewById(R.id.lblFragment1);
Toast.makeText(getActivity(), lbl.getText(), Toast.LENGTH_SHORT).show();
}

No comments: