Menambahkan Fragment Secara Dinamis Saat Runtime

Fragment memungkinkan kita untuk membagi-bagi UI kita ke dalam wadah-wadah kecil yang disa di-konfigurasi, tetapi kelebihan fragment yang sesungguhnya adalah ketika kita menambahkan fragment-fragment secara dinamis ke activity pada saat runtime. Dalam latihan sebelumnya, kita sudah melihat bagaimana kita bisa menambahkan fragment-fragment ke suatu activity dengan memodifikasi file layout XML saat desain layout di awal. 

Di dunia nyata, sangatlah berguna apabila kita membuat fragment dan menambahkannya ke activity pada saat runtime. Misalnya, bila app berjalan pada smartphone, kita mungkin akan mengisi activity dengan satu fragment saja tetapi apabila app berjalan pada tablet kita mungkin akan mengisi activity dengan dua atau lebih fragment, karena tablet memiliki layar yang jauh lebih besar dibandingkan dengan smartphone.

Berikut adalah latihan menambahkan fragment secara dinamis ke activity saat runtime.

1. Kita masih menggunakan project yang sama dengan latihan sebelumnya. Kemudian kita modifikasi file layout utama "activity_main.xml" dengan men-komentar-kan kedua elemen <fragment> 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
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>

2. Kemudian kita modifikasi dan tambahkan kode berikut dalam file utama "MainActivity.java":
package com.example.fragments;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.graphics.Point;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Display;
import android.view.WindowManager;

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

fragmentTransaction.commit();
}
}
3. Kemudian kita jalankan di emulator Android Studio dan setelah tampil silahkan coba untuk mengubah-ubah tampilan portrait dan landscape. Seharusnya tampilan kurang lebih adalah seperti berikut:

Layout yang berubah secara dinamis ketika mode portrait dan landscape
Penjelasan:

Untuk menambahkan fragment ke activity, kita harus menggunakan class 'FragmentManager' dengan cara membuat instansnya seperti berikut:
FragmentManager fragmentManager = getFragmentManager();
Kemudian kita juga perlu menggunakan class 'FragmentTranbsaction' untuk melakukan transaksi fragment pada activity kita (misalnya untuk menambah, menghapus atau mengganti) seperti berikut:
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Dalam contoh latihan ini, kita menggunakan interface 'WindowManager' untuk menentukan apakah perangkat yang sedang digunakan ada dalam mode portrait atau landscape. Setelah ditentukan, kita perlu menambahkan fragment yang tepat ke activity dengan membuat fragment-nya dan kemudian memanggil method 'replace()' dari object 'FragmentTransaction' untuk menambahkan fragment tersebut ke container view yang sudah ditentukan (dalam latihan ini, 'android.R.id.content' akan mengacu ke content view dari activity tersebut):
/*mode landscape*/
Fragment1 fragment1 = new Fragment1();
/*android.R.id.Content akan mengacu ke content view activity tersebut*/
fragmentTransaction.replace(android.R.id.content, fragment1);
Penggunaan method 'replace()' pada dasarnya sama dengan memanggil method 'remove()' yang diikuti dengan method 'add()' dari object 'FragmentTransaction'. Untuk memastikan bahwa ada perubahan, kita perlu untuk memanggil method 'commit()':
fragmentTransaction.commit();

No comments: