PERANGKAT LUNAK
IK322 – MOBILE PROGRAMING
1. Latihan Activity
Tujuan
Logika Dasar
2. Setelah muncul jendela Create New Project, atur nama aplikasi dan domain perusahaan /
website Anda. Sebaiknya jangan sama dengan apa yang ada dicontoh. Dan jangan lupa pula
untuk menentukan lokasi proyek.
3. Kemudian pilih tipe peranti (device) untuk aplikasi beserta target minimum SDK yang akan
digunakan. Pilihan target Android SDK akan mempengaruhi banyaknya peranti yang dapat
menggunakan aplikasi. Di sini kita memilih tipe peranti Phone and Tablet dan nilai
minimum SDK kita pasang ke Level 15 (Ice Cream Sandwich). Klik Next untuk melanjutkan.
4. Pada bagian ini kita akan memilih tipe activity awal dari template yang telah disediakan.
Saat ini Android Studio sudah menyediakan berbagai macam template activity dari yang
paling sederhana hingga yang paling kompleks seperti :
Add No Activity : Tidak ada activity yang ditambahkan
Basic Activity : Activity dengan template komponen material design seperti
FloatingActionButton
Empty Activity : Activity dalam bentuk yang paling dasar
Fullscreen Activity : Activity fullscreen tanpa status bar
Google AdMob Ads Activity : Activity dengan konfigurasi default iklan Admob
Google Maps Activity : Activity dengan menyediakan konfigurasi dasar Google Maps
Login Activity : Activity untuk halaman login
Master / Detail Flow : Activity yang diperuntukan untuk alur aplikasi master detail pada
peranti tablet
Saat ini kita pilih tipe empty activity, klik Next untuk melanjutkan.
5. Selanjutnya, tentukan nama activity pertama kita, saat ini kita biarkan pada kondisi apa
adanya. Ingat, jika suatu saat nanti kita ingin melakukan penambahan activity , maka
sebaiknya nama untuk activity tersebut disamakan dengan nama kelasnya dan diakhiri
6. Selamat! Anda telah berhasil membuat sebuah proyek baru Android. Biasanya, tampilan
layar Anda akan seperti contoh di bawah ini :
7. Di sebelah kanan anda adalah workspace dimana Activity anda berada dan bernama
MainActivity.java dengan layoutnya activity_main.xml. Di sebelah kiri Anda terdapat
struktur proyek, di mana nanti kita akan banyak menambahkan berbagai komponen baru,
asset dan library. Untuk lebih mengenal Android Studio lebih dalam silakan baca materi ini
https://developer.android.com/studio/intro/index.html
Selanjutnya kita akan mulai melakukan pengkodean aplikasi atau lebih enaknya disebut ngoding.
Untuk mengoptimalkan proses pengetikan, Anda dapat memanfaatkan code completion dengan
menekan ctrl + space. Android Studio juga akan meng-import package dari komponen yang
digunakan.
Dilarang Keras untuk copy - paste! Ngoding pelan-pelan akan membuat Anda lebih jago di
masa depan.
Selamat ngoding!
13. <TextView
14. android:layout_width="match_parent"
15. android:layout_height="wrap_content"
16. android:text="Panjang" />
17.
18. <EditText
19. android:id="@+id/edt_length"
20. android:layout_width="match_parent"
21. android:layout_height="wrap_content"
22. android:inputType="numberDecimal"
23. android:lines="1" />
24.
25. <TextView
26. android:layout_width="match_parent"
27. android:layout_height="wrap_content"
28. android:text="Lebar" />
29.
30. <EditText
31. android:id="@+id/edt_width"
32. android:layout_width="match_parent"
33. android:layout_height="wrap_content"
34. android:inputType="numberDecimal"
35. android:lines="1" />
36.
37. <TextView
38. android:layout_width="match_parent"
39. android:layout_height="wrap_content"
40. android:text="Tinggi" />
41.
42. <EditText
43. android:id="@+id/edt_height"
44. android:layout_width="match_parent"
45. android:layout_height="wrap_content"
46. android:inputType="numberDecimal"
47. android:lines="1" />
48.
49. <Button
50. android:id="@+id/btn_calculate"
51. android:layout_width="match_parent"
52. android:layout_height="wrap_content"
53. android:text="Hitung" />
54.
55. <TextView
56. android:id="@+id/tv_result"
57. android:layout_width="match_parent"
58. android:layout_height="wrap_content"
59. android:gravity="center"
60. android:text="Hasil"
61. android:textSize="24sp"
62. android:textStyle="bold" />
63. </LinearLayout>
2. Akan muncul warning pada atribut android:text pada layout tersebut. Ini karena kita
melakukan hardcoding pada nilai string-nya. Mari kita hilangkan code warning tersebut
dengan menekan Alt+Enter pada attribut android:text. Akan muncul dialog seperti ini,
pilihlah extract string resource.
3. Kemudian akan muncul dialog seperti di bawah ini. Sesuaikan dengan nama yang ada.
4. Fungsi extract string resource akan secara otomatis menambahkan nilai dari android:text ke dalam
berkas res → values → strings.xml. Lakukan hal yang sama pada view lainnya hingga tidak ada
warning lagi. Jika kita buka berkas strings.xml, maka isinya akan menjadi seperti ini:
1. <resources>
2. <string name="app_name">BarVolume</string>
3. <string name="width">Lebar</string>
4. <string name="height">Tinggi</string>
5. <string name="calculate">Hitung</string>
6. <string name="result">Hasil</string>
7. <string name="length">Panjang</string>
8. </resources>
Jika terjadi kesalahan pada atribut dimens, maka kita perlu menambahkan berkas dimens.xml di
dalam res → values → dimens.xml. Kesalahan ini disebabkan karena pada Android Studio 2.3, berkas
dimens.xml sudah tidak dibuat secara otomatis. Langsung saja tambahkan dengan cara Klik Kanan
pada directory res. Akan muncul dialog seperti ini.
7. Jika berkas dimens.xml sudah dibuat, sesuaikan isinya menjadi seperti berikut.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtWidth = (EditText)findViewById(R.id.edt_width);
edtHeight = (EditText)findViewById(R.id.edt_height);
edtLength = (EditText)findViewById(R.id.edt_length);
btnCalculate = (Button)findViewById(R.id.btn_calculate);
tvResult = (TextView)findViewById(R.id.tv_result);
btnCalculate.setOnClickListener(this);
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_calculate){
String length = edtLength.getText().toString().trim();
String width = edtWidth.getText().toString().trim();
String height = edtHeight.getText().toString().trim();
boolean isEmptyFields = false;
if (TextUtils.isEmpty(length)){
isEmptyFields = true;
edtLength.setError("Field ini tidak boleh kosong");
}
if (TextUtils.isEmpty(width)){
isEmptyFields = true;
edtWidth.setError("Field ini tidak boleh kosong");
}
if (TextUtils.isEmpty(height)){
isEmptyFields = true;
edtHeight.setError("Field ini tidak boleh kosong");
}
if (!isEmptyFields) {
double l = Double.parseDouble(length);
double w = Double.parseDouble(width);
double h = Double.parseDouble(height);
double volume = l * w * h;
tvResult.setText(String.valueOf(volume));
}
}
}
Jangan khawatir! Silakan klik di atas baris merah tersebut dan klik pada ikon bola lampu. Atau
dengan tekan tombol Alt + Enter lalu pilih implements method.
2. Setelah selesai, silakan jalankan aplikasi dengan memilih menu Run → Run ‘app’ dari menu bar.
Kemudian ada pilihan seperti ini.
Itu tandanya adb (Android Debugger) pada peranti yang Anda punya telah terhubung dengan
Android Studio. Jika Anda tidak memiliki peranti, maka Anda dapat menggunakan emulator. Ikuti
materinya disini https://developer.android.com/studio/run/managing-avds.html.
tekan tombol Hasil dan hasilnya akan ditampilkan di obyek textview tvHasil.
3. Apakah kita sudah selesai? Belum! Masih ada yang kurang. Ketika nilai luas sudah dihitung
dan kemudian terjadi pergantian orientasi pada peranti, maka hasil perhitungan tadi akan
hilang. Tambahkan beberapa baris berikut pada MainActivity.java.
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString(STATE_HASIL, tvResult.getText().toString());
super.onSaveInstanceState(outState);
}
Kemudian tambahkan juga beberapa baris berikut pada baris terakhir metode onCreate.
if (savedInstanceState != null){
String hasil = savedInstanceState.getString(STATE_HASIL);
tvResult.setText(hasil);
}
Bedah Code
Pembahasan tentang layout xml
1. xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
Kode di atas menandakan namespace yang digunakan dalam keseluruhan berkas xml ini.
Disini kita menggunakan beberapa komponen user interface yang disebut view. Diantaranya:
LinearLayout : Komponen view bertipe viewgroup yang menjadi parent dari semua sub komponen
view (sub view) di dalamnya. Komponen ini bersifat sebagai kontainer untuk komponen lain dengan
orientasi secara vertikal atau horizontal.
Cara membaca :
1. <TextView
2. android:layout_width="match_parent"
3. android:layout_height="wrap_content"
4. android:text="Panjang"
5. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
Komponen diatas adalah sebuah TextView. Perhatikan gambar di bawah ini, warna ungu menandakan
namespace yang digunakan; warna biru adalah atribut dari komponen dan warna hijau adalah nilai dari
atribut. Penjelasannya seperti dibawah ini:
match_parent: Ini berarti bahwa ukuran dimensi sebuah View disesuaikan dengan ukuran layar secara
horizontal jika pada layout_width dan vertikal jika pada layout_height.
wrap_content : Ini berarti bahwa ukuran dimensi sebuah View disesuaikan dengan ukuran konten
didalamnya baik secara horizontal pada layout_width dan vertikal jika pada layout_height.
1. <Button
2. android:id="@+id/btn_calculate"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:text="Hitung"
6. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
1. android:id="@+id/btn_calculate"
Jika kita memberikan id pada sebuah view maka kita telah memberikan identifier untuk view tersebut.
Pemberian id ini dimaksudkan agar kita bisa melakukan manipulasi/pengendalian pada level logic di
komponen seperti activity atau fragment.
Id di atas akan diciptakan di berkas R.java dan disimpan dalam bentuk hexa bertipe data integer public
static final int btn_calculate=0x7f0b0057.
Acuan untuk menyusun tampilan pada relativelayout akan dibahas pada modul selanjutnya.
Menandakan bahwa kelas Java di atas merupakan sebuah activity karena inherit ke superclass bernama
AppCompatActivity.
1. implements View.OnClickListener
Ini adalah listener yang kita implementasikan untuk memantau kejadian klik pada komponen tombol
(button).
Jangan khawatir. Silakan klik di atas baris merah tersebut dan klik pada ikon bola lampu. Anda juga
dapat menekan tombol (Alt + Enter) lalu pilih implements method.
Kode di atas mendeklarasikan semua komponen view yang akan dimanipulasi. Kita deklarasikan secara
global agar bisa dikenal di keseluruhan bagian kelas.
1. @Override
2. protected void onCreate(Bundle savedInstanceState) {
3. super.onCreate(savedInstanceState);
4. setContentView(R.layout.activity_main);
5. edtWidth = (EditText)findViewById(R.id.edt_width);
6. edtHeight = (EditText)findViewById(R.id.edt_height);
7. edtLength = (EditText)findViewById(R.id.edt_length);
8. btnCalculate = (Button)findViewById(R.id.btn_calculate);
9. tvResult = (TextView)findViewById(R.id.tv_result);
10. btnCalculate.setOnClickListener(this);
11. }
Metode onCreate() merupakan metode utama pada activity. Di sinilah kita dapat mengatur layout xml.
Semua proses inisialisasi komponen yang digunakan akan dijlankan disini.. Pada metode ini kita casting
semua komponen view yang kita telah deklarasikan sebelumnya, agar dapat kita manipulasi.
1. setContentView(R.layout.activity_main);
Maksud baris diatas adalah kelas MainActivity akan menampilkan tampilan yang berasal dari layout
activity_main.xml.
1. edtWidth = (EditText)findViewById(R.id.edt_width);
Maksud dari baris diatas adalah obyek edittext edtWidth disesuaikan (cast) dengan komponen
1. btnCalculate.setOnClickListener(this);
Kita memasang event click listener untuk obyek btnCalculate sehingga sebuah aksi dapat dijalankan
ketika obyek tersebut diklik. Keyword this merujuk pada obyek Activity saat ini yang telah
mengimplementasikan listener OnClickListener sebelumnya.
Pembahasan saveInstanceState
1. @Override
2. protected void onSaveInstanceState(Bundle outState) {
3.
4. outState.putString(STATE_HASIL, tvResult.getText().toString());
5. super.onSaveInstanceState(outState);
6. }
Perhatikan metode onSaveInstanceState. Di dalam metode tersebut, hasil perhitungan yang ditampilkan
pada tvResult dimasukkan pada bundle kemudian disimpan isinya. Setelah onSaveInstanceState berhasil
dijalankan, maka activity akan melakukan proses onDestroy dan menjalankan kembali onCreate secara
otomatis.
1. if (savedInstanceState != null){
2. String hasil = savedInstanceState.getString(STATE_HASIL);
3. tvResult.setText(hasil);
4. }
Pada onCreate inilah kita menggunakan nilai bundle yang telah kita simpan sebelumnya pada
onSaveInstanceState. Nilai tersebut kita isikan kembali pada tvResult.
2. Latihan Intent
Tujuan
Codelab ini menitik beratkan pada implementasi intent untuk melakukan perpindahan dari
activity ke activity lain, dengan atau tidak membawa data. Beberapa bagian dari codelab ini akan
menjawab beberapa pertanyaan umum dalam pengembangan aplikasi Android sebagai berikut:
Logika Dasar
Berpindah dari satu Activity ke Activity lain dengan membawa data. Activity asal
akan mengirimkan data melalui Intent dan Activity tujuan akan menerima data yang
dikirimkan.
Target & Minimum Target SDK : Phone and Tablet, Api level 15
Tipe Activity : Empty Activity
Activity Name : MainActivity
3. Kita akan memiliki 5 tombol dengan fungsi yang berbeda-beda dan 1 buah TextView untuk
menampilkan data yang berasal dari intent. Baik, kita akan mulai selangkah demi selangkah
dimulai dari tombol yang paling atas. Kondisikan activity_main.xml menjadi seperti ini:
<Button
android:id="@+id/btn_move_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Pindah Activity"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>
</LinearLayout>
Jangan lupa untuk menambahkan file dimens.xml secara manual di dalam res →
values. Dan isikan file dimens.xml seperti berikut
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveActivity = (Button) findViewById(R.id.btn_move_activity);
btnMoveActivity.setOnClickListener(this);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_move_activity:
break;
}
}
}
5. Button btnMoveActivity akan memiliki fungsi untuk berpindah activity ke activity lain. Sekarang kita
buat Activity baru dengan cara sebagai berikut: Klik kanan di package utama aplikasi package
name → New → Activity → Empty Activity.
6. Untuk menandakan bahwa perpindahan activity berhasil, silakan tambahkan satu TextView
dan kondisikan activity_move.xml menjadi seperti berikut.
7. Setelah activity tujuan sudah berhasil diciptakan, sekarang saatnya menambahkan suatu
intent pada method onClick() di MainActivity.java menjadi sebagai berikut.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveActivity = (Button) findViewById(R.id.btn_move_activity);
btnMoveActivity.setOnClickListener(this);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_move_activity:
Intent moveIntent = new Intent(MainActivity.this,
MoveActivity.class);
startActivity(moveIntent);
break;
}
}
}
Selesai! Langkah pertama untuk memindahkan satu activity ke activity lain sudah selesai, sekarang
silakan jalankan aplikasi Anda dengan mengklik tombol pada menu bar. Seharusnya sekarang anda
sudah bisa memindahkan activity dengan mengklik tombol ‘Pindah Activity’.
Kita telah belajar bagaimana membuat suatu activity baru. Di materi sebelumnya, syarat suatu
activity haruslah terdaftar pada berkas AndroidManifest.xml. Karena menggunakan Android Studio,
proses pendaftaran tersebut dilakukan secara otomatis.
Perhatikan bahwa MoveActivity sudah teregistrasi di AndroidManifest.xml dan sekarang sudah aman
jika kita melakukan perpindahan activity dari MainActivity ke MoveActivity.
Umumnya, jika kita lupa meregistrasikan Activity baru ke dalam berkas AndroidManifest.xml akan
terjadi error seperti ini "android.content.ActivityNotFoundException:Unable to find explicit activity
class".
1. <intent-filter>
2. <action android:name="android.intent.action.MAIN" />
3. <category android:name="android.intent.category.LAUNCHER" />
4. </intent-filter>
Intent-filter merupakan mekanisme untuk menentukan bagaimana suatu activity dijalankan oleh
Android Runtime (ART) atau Dalvik Virtual Machine (DVM).
Baris di atas bermakna bahwa MainActivity memiliki intent action utama dari keseluruhan activity yang
ada di suatu Aplikasi.
Kode di atas menandakan bahwa MainActivity akan dikategorikan sebagai activity launcher. Activity
tersebut akan diluncurkan pertama kali ketika pengguna menekan ikon aplikasi pada peranti Android.
Selanjutnya,
Kita membuat suatu obyek Intent dengan cara seperti di atas dengan memberikan kelas Activity asal
(MainActivity.this) dan kelas Activity tujuan (MoveActivity.class) pada konstruktor kelas Intent.
Kelas asal selalu menggunakan .this yang menandakan obyek kelas saat ini. Kelas tujuan selalu
menggunakan .class.
Jika kita menggunakan code assistant dari Android Studio, maka akan tampil rekomendasi (code hint)
sebagai berikut:
Pada konteks diatas kita memilih Context packageContext, Class cls sebagai inputan untuk nilai
constructor intent.
startActivity(moveIntent) : metode ini akan menjalankan activity baru tanpa membawa data. Obyek
intent yang diinputkan adalah obyek moveIntent yang akan menjalankan MoveActivity.
Pada modul ini kita telah berhasil memindahkan satu Activity ke Activity lain dengan tidak membawa
data. Pada bagian selanjutnya kita akan membuat suatu Intent yang di dalamnya akan membawa data
ke Activity tujuan.
Selanjutnya kita akan membuat sebuah intent yang didalamnya akan membawa data ke activity
tujuan. Anda Siap?
package com.studio.erlangga.myintentapp;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveActivity = (Button) findViewById(R.id.btn_move_activity);
btnMoveActivity.setOnClickListener(this);
btnMoveWithDataActivity =
(Button)findViewById(R.id.btn_move_activity_data);
btnMoveWithDataActivity.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_move_activity:
Intent moveIntent = new Intent(MainActivity.this,
MoveActivity.class);
startActivity(moveIntent);
break;
case R.id.btn_move_activity_data:
break;
}
}
}
3. Selanjutnya, buat Activity baru lagi seperti cara sebelumnya dan beri nama
MoveWithDataActivity. Lalu, pada layout activity_move_with_data.xml kita tambahkan
sebuah TextView ber-ID untuk menampilkan data yang dikirimkan dari Activity asal.
5. Dan sekarang saatnya kita menambahkan obyek Intent pada MainActivity.java seperti baris
dibawah ini.
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_move_activity:
Intent moveIntent = new Intent(MainActivity.this,
MoveActivity.class);
startActivity(moveIntent);
break;
case R.id.btn_move_activity_data:
Intent moveWithDataIntent = new Intent(MainActivity.this,
MoveWithDataActivity.class);
moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME,
"Halo It's My Name Erlangga Boy");
moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
startActivity(moveWithDataIntent);
break;
}
}
6. Silakan jalankan aplikasi Anda, kemudian coba klik pada tombol ‘Pindah Activity dengan
Data’. Seharusnya Anda sudah bisa memindahkan satu activity ke activity lain dengan
membawa data.
Pada bagian sebelumnya Anda sudah mempelajari bagaimana memindahkan satu activity ke
activityactivity lain dengan membawa data. Dan itu sangat penting karena ketika kita
Erlangga, S.Kom., M.T. 42
Departemen Pendidikan Ilmu Komputer
Fakultas Pendidikan Matematika dan Ilmu Pengetahuan Alam (FPMIPA)
MODUL PEMBELAJARAN MATA KULIAH KEAHLIAN REKAYASA
PERANGKAT LUNAK
IK322 – MOBILE PROGRAMING
mengembangkan suatu aplikasi Android yang kompleks. Akan ada banyak sekali activity yang
terlibat. Lancarnya perpindahan activity dengan data menjadi hal yang penting untuk
memberikan pengalaman yang baik kepada pengguna.
Perbedaan mendasar antara memindahkan activity dengan membawa data dan tidak adalah
dengan menempatkan data yang akan dikirim ke activity tujuan pada baris ini.
1. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME,
"DicodingAcademy Boy");
2. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
Kita memanfaatkan metode putExtra() untuk mengirimkan data bersamaan dengan obyek
Intent. Sedangkan metode putExtra() itu sendiri merupakan metode yang menampung
pasangan key-value dan memiliki beberapa pilihan tipe input seperti berikut :
Hampir semua tipe data untuk input value didukung oleh metode putExtra().
1. moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_NAME,"DicodingAc
ademy Boy");
Catatan : Key yang dikirimkan melalui putExtra() harus sama dengan key sewaktu mengambil
nilai dari data yang dikirimkan melalui getStringExtra().
Dalam konteks di atas, key yang digunakan untuk mengirim dan mengambil nilai data adalah
sama, yaitu EXTRA_NAME (yang bernilai “extra_name”). Nilai dari data yang dikirimkan melalui
intent disimpan ke dalam variabel name bertipe data string.
Nilai dari variabel age yang bertipe data integer berasal dari getIntent().getIntExtra(Key, nilai
default). Key yang digunakan untuk mengirimkan dan mengambil data adalah EXTRA_AGE (yang
bernilai “extra_age”).
Selamat! Anda telah mempelajari dua intent explicit dengan atau tidak membawa data.
Sebelumnya, mengirimkan data bernilai tunggal dari satu activity ke activity lain adalah hal yang
mudah. Bernilai tunggal karena data yang dikirimkan berasal dari satu tipe data.
Misalnya pada contoh di atas, pengiriman nilai data name dan age dilakukan secara sendiri-
sendiri. Yang satu bertipe data string dan yang lainnya bertipe data integer.
Sekarang pertanyaanya bagaimana Anda bisa mengirimkan data dalam bentuk Plain Old Java
Object (POJO) dari satu activity ke activity lain melalui intent? Caranya adalah dengan
mengubah obyek POJO yang Anda miliki ke dalam bentuk obyek parcelable. Di Android Studio
sudah ada fasilitas plugin bernama Android Parcelable Generator untuk memudahkan proses
tersebut.
Selanjutnya, kita akan membuat sbeuah intent yang di dalamnya akan membawa data dengan
Plain Old Java Object (POJO) ke activity tujuan.
Bagi yang belum mengenal apa itu Plain Old Java Object (POJO), berikut penjelasan singkatnya.
POJO adalah sebuah kelas Java biasa yang tidak bergantung dengan kelas lain. Umumnya kelas
POJO ini disebut sebagai kelas Java yang memiliki properti/variabel dan metode setter-getter.
Seperti dibawah ini.
Lalu apa kegunaan obyek POJO? POJO akan membantu kita saat aplikasi semakin kompleks.
Contohnya POJO bisa kita gunakan untuk melakukan koneksi ke server untuk request API atau
akses ke database lokal dengan SQLite.
Selain POJO, Android juga memiliki obyek parcelable POJO. Obyek ini akan lebih memudahkan
kita untuk melakukan pengiriman data dari satu activity ke activity lainnya.
1. Sebelum membuat obyek parcelable, kita buat kelas Java POJO terlebih dahulu. Caranya,
klik kanan pada package utama proyek → New → Java Class
2. Pada dialog, isikan nama kelas dengan ‘Person’. Lalu klik OK.
3. Setelah selesai terbentuk kelas Person, kondisikan kelas tersebut menjadi seperti ini.
Anda tidak perlu menulis satu per satu metode setter-getter nya, di Android Studio
tersedia fasilitas generator untuk hal tersebut. Caranya, setelah Anda menentukan
variabel apa saja yang akan digunakan lakukan, lakukan beberapa langkah sebagai
berikut :
5. Pilih semua variabel dengan cara Ctrl+A pada windows dan Command+A pada mac. Bila
sudah, maka klik OK. Secara otomatis metode setter dan getter masing-masing variabel
akan dibuatkan
Selanjutnya kita akan menambahkan plugin Android Parcelable Generator pada Android Studio.
Plugin ini berguna untuk mengubah kelas POJO menjadi obyek Parcelable. Langkah-langkahnya
sebagai berikut :
1. Buka settings dengan cara File → Settings pada Windows dan Android Studio →
Preferences pada Mac.
2. Pilih menu Plugin. Dan inputkan "Android Parcelable" pada search box kemudian tekan
Enter.
3. Klik browse, dengan ini kita memerintahkan Android Studio untuk melakukan pencarian
plugin di server. Setelah ketemu Android Parcelable code generator, klik Install.
4. Biarkan Android Studio melakukan proses instalasi plugin. Bila sukses, maka Anda akan
diminta untuk melakukan restart Android Studio yang sedang berjalan.
Klik Restart → Klik OK dan jika ada pilihan untuk restart Android Studio maka pilih restart.
Biarkan Android Studio untuk restart agar plugin-nya dapat kita gunakan setelahnya.
Catatan : Jika dialog search tidak berhasil mencari plugin, kosongkan kata pencarian dan
masukkan kembali kata pencarian "Android Parcelable". Ini bisa terjadi karena ada
error di dalam dialog Plugins.
Klik kanan pada workspace (pastikan anda berada pada tab kelas Person) pilih menu
Generate.
6. Pilih Parcelable.
7. Pada dialog box yang tampil, pilih semua variable yang ada lalu klik OK.
Sekarang Anda bisa menemukan beragam metode parcelable untuk kelas Person. Sekarang
kelas Person sudah sah menjadi kelas parcelable dan dapat dikirimkan ke activity lain
melalui intent.
8. Sekarang waktunya kita implementasikan pada intent. Namun sebelumnya tambahkan satu
tombol lagi pada activity_main.xml sebagai berikut:
Erlangga, S.Kom., M.T. 53
Departemen Pendidikan Ilmu Komputer
Fakultas Pendidikan Matematika dan Ilmu Pengetahuan Alam (FPMIPA)
MODUL PEMBELAJARAN MATA KULIAH KEAHLIAN REKAYASA
PERANGKAT LUNAK
IK322 – MOBILE PROGRAMING
9. Setelah selesai dengan layout xml, sekarang kita tambahkan (pada bagian yang ditebalkan)
juga di kelas MainActivity.java sehingga menjadi sebagai berikut :
package com.studio.erlangga.myintentapp;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveActivity = (Button) findViewById(R.id.btn_move_activity);
btnMoveActivity.setOnClickListener(this);
btnMoveWithDataActivity =
(Button)findViewById(R.id.btn_move_activity_data);
btnMoveWithDataActivity.setOnClickListener(this);
btnMoveWithObject =
(Button)findViewById(R.id.btn_move_activity_object);
btnMoveWithObject.setOnClickListener(this);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_move_activity:
Intent moveIntent = new Intent(MainActivity.this,
MoveActivity.class);
startActivity(moveIntent);
break;
case R.id.btn_move_activity_data:
Intent moveWithDataIntent = new Intent(MainActivity.this,
MoveWithDataActivity.class);
}
Erlangga,}S.Kom., M.T. 55
}
Departemen Pendidikan Ilmu Komputer
Fakultas Pendidikan Matematika dan Ilmu Pengetahuan Alam (FPMIPA)
MODUL PEMBELAJARAN MATA KULIAH KEAHLIAN REKAYASA
PERANGKAT LUNAK
IK322 – MOBILE PROGRAMING
12. Setelah kita membuat activity tujuan dengan sempurna, sekarang kita hanya butuh
menambahkan beberapa baris pada bagian switch… case, sehingga kode MainActivity.java
kita menjadi sebagai berikut:
package com.studio.erlangga.myintentapp;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveActivity = (Button) findViewById(R.id.btn_move_activity);
btnMoveActivity.setOnClickListener(this);
btnMoveWithDataActivity =
(Button)findViewById(R.id.btn_move_activity_data);
btnMoveWithDataActivity.setOnClickListener(this);
btnMoveWithObject =
(Button)findViewById(R.id.btn_move_activity_object);
btnMoveWithObject.setOnClickListener(this);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_move_activity:
Intent moveIntent = new Intent(MainActivity.this,
MoveActivity.class);
startActivity(moveIntent);
break;
case R.id.btn_move_activity_data:
Intent moveWithDataIntent = new Intent(MainActivity.this,
MoveWithDataActivity.class);
moveWithObjectIntent.putExtra(MoveWithObjectActivity.EXTRA_PERSON,
mPerson);
startActivity(moveWithObjectIntent);
break;
MODUL PEMBELAJARAN MATA KULIAH KEAHLIAN REKAYASA
PERANGKAT LUNAK
IK322 – MOBILE PROGRAMING
Akhirnya, Anda sudah berhasil menerapkan 3 tipe perpindahan Activity secara eksplisit melalui
Intent. Sekarang, mari kita dalami penjelasannya satu per satu.
Di atas kita menciptakan sebuah obyek Person bernama mPerson yang mana kelas tersebut
adalah Parcelable. Kita atur semua data sesuai dengan propertinya. Setelah selesai kita akan
mengirimkan obyek tersebut ke MoveWithObjectActivity melalui sebuah intent dibawah ini.
Metode putExtra() yang kita pilih saat ini adalah putExtra(String name, Parcelable value).
Dengan EXTRA_PERSON merupakan variabel static bertipe data string dan bernilai
“extra_person”.
1. Dan ini yang seru, karena obyek ini terdiri dari beragam tipe data pada
atribut atau propertinya, kita hanya cukup membungkus itu semua kedalam
obyek parcelable. Melalui getIntent().getParcelableExtra(Key) Anda
dapat mengambil nilai obyek Person yang sebelumnya telah dikirim dan
menampilkannya seperti ini.
2. String text = "Name : "+mPerson.getName()+", Email :
"+mPerson.getEmail()+", Age : "+mPerson.getAge()
3. + ", Location : "+mPerson.getCity();
4. tvObject.setText(text);
Selanjutnya, kita akan membuat sebuah contoh aplikasi dengan menggunakan intent implicit.
Anda sudah belajar bagaimana menggunakan intent dengan tipe eksplisit. Sekarang saatnya
Anda melanjutkan ke intent dengan tipe implicit.
1. Buka kembali activity_main.xml tambahkan satu tombol lagi sehingga file activity_main.xml
menjadi seperti berikut :
2. Sekarang, buka kembali MainActivity.java dan lanjutkan dengan melakukan casting tombol
Dial Number, set listener dan menambahkan action ketika tombol diklik.
package com.studio.erlangga.myintentapp;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveActivity = (Button) findViewById(R.id.btn_move_activity);
btnMoveActivity.setOnClickListener(this);
btnMoveWithDataActivity =
(Button)findViewById(R.id.btn_move_activity_data);
btnMoveWithDataActivity.setOnClickListener(this);
btnMoveWithObject =
(Button)findViewById(R.id.btn_move_activity_object);
btnMoveWithObject.setOnClickListener(this);
btnDialPhone = (Button)findViewById(R.id.btn_dial_number);
btnDialPhone.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_move_activity:
Intent moveIntent = new Intent(MainActivity.this,
MoveActivity.class);
startActivity(moveIntent);
break;
case R.id.btn_move_activity_data:
Intent moveWithDataIntent = new
Intent(MainActivity.this, MoveWithDataActivity.class);
moveWithDataIntent.putExtra(MoveWithDataActivity.EXTRA_AGE, 5);
startActivity(moveWithDataIntent);
break;
case R.id.btn_move_activity_object:
Erlangga, S.Kom., M.T. Person mPerson = new Person(); 62
Departemen PendidikanmPerson.setName("Erlangga
Ilmu Komputer
mPerson.setAge(5);
Studio");
moveWithObjectIntent.putExtra(MoveWithObjectActivity.EXTRA_PERSON,
mPerson);
startActivity(moveWithObjectIntent);
break;
case R.id.btn_dial_number:
String phoneNumber = "081321397362";
Intent dialPhoneIntent = new Intent(Intent.ACTION_DIAL,
Uri.parse("tel:"+phoneNumber));
startActivity(dialPhoneIntent);
break;
}
}
}
Setelah selesai, silakan jalankan lagi aplikasi anda. Yeay, Anda sudah bisa men-dial
sebuah nomor telepon melalui aplikasi bawaan dari peranti anda. Selamat!
Baru saja kita mengimplementasikan penggunaan intent secara implicit untuk melakukan
proses dial sebuah nomor telepon. Pada bagian new Intent(Intent.ACTION_DIAL,
Uri.parse("tel:"+phoneNumber)); kita menggunakan inputan new Intent(ACTION, Uri); pada
konstruktor sewaktu menciptakan obyek Intent dimana :
Action : Intent.ACTION_DIAL
Erlangga, S.Kom., M.T. 64
Departemen Pendidikan Ilmu Komputer
Fakultas Pendidikan Matematika dan Ilmu Pengetahuan Alam (FPMIPA)
MODUL PEMBELAJARAN MATA KULIAH KEAHLIAN REKAYASA
PERANGKAT LUNAK
IK322 – MOBILE PROGRAMING
Uri : Uri.parse("tel:"+phoneNumber)
Variabel ACTION_DIAL menentukan intent filter dari aplikasi-aplikasi yang bisa menangani
action tersebut. Di sini aplikasi yang memiliki kemampuan untuk komunikasi akan muncul pada
opsi pilihan, sebagaimana ditampilkan ke pengguna.
Selain ACTION_DIAL, di Android sudah tersedia berbagai action yang tinggal didefinisikan
sewaktu menciptakan obyek Intent untuk mengakomodir berbagai tujuan.
Intent
Buat yang belum tau apa itu Uri, berikut penjelasan singkatnya :
Uri adalah sebuah untaian karakter yang digunakan untuk mengidentifikasi nama, sumber, atau
layanan di internet sesuai dengan RFC 2396. Pada Uri.parse("tel:"+phoneNumber) kita
melakukan parsing Uri dari bentuk teks string menjadi sebuah obyek uri dengan menggunakan
metode static parse(String). Secara struktur, dibagi menjadi :
Dimana “tel” adalah sebuah skema yang disepakati untuk sumber daya telepon dan
phoneNumber adalah variabel string yang bernilai “081210841382”. Skema lain dari Uri seperti
“geo” untuk peta, “http” untuk browser sisanya bisa dilihat di halaman ini :
Common Intents
Pada prosesnya, pemanggilan intent secara implicit akan berjalan sesuai dengan diagram
dibawah ini.
Anda sudah mempelajari 3 buah intent secara eksplisit dan 1 buah intent secara implicit.
Selamat!
Selanjutnya, kita akan membuat sebuah Intent yang didalamnya akan membawa data dengan
ResultActivity.
Pada modul ini, kita akan membedah hubungan activity dan intent dalam menerima nilai balik.
Kadang kala, ketika kita menjalankan sebuah activity dari activity lain, kita mengharapkan ada
nilai hasil balik dari activity yang dijalankan ketika ia ditutup.
Contohnya kita memiliki activity A yang menjalankan activity B untuk melakukan sebuah proses.
Lalu nilai hasil dari proses tersebut dikirimkan kembali ke activity A sebelum activity B ditutup
dengan pemanggilan metode finish(). Itulah yang dinamakan sebuah activitymenerima nilai
hasil balik dari activityyang dia jalankan. Untuk memperjelas, ayo kita lanjutkan lagi proses
ngodingnya.
1. Sekarang untuk menerapkan konsep diatas, buat sebuah activity baru dengan nama
MoveForResultActivity. Setelah itu, pada activity_move_for_result.xml silakan kondisikan
layout kita dengan 1 buah TextView, 1 buah Radio Group, 3 buah Radio Button dan 2
buah Button sebagai berikut :
tools:context="com.studio.erlangga.myintentapp.MoveForResultActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Pilih angka yang kamu suka"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>
<RadioGroup
android:id="@+id/rg_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioButton
android:id="@+id/rb_50"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="50"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>
<RadioButton
android:id="@+id/rb_100"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="100"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>
<RadioButton
android:id="@+id/rb_150"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="150"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>
<RadioButton
android:id="@+id/rb_200"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="200"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>
</RadioGroup>
<Button
android:id="@+id/btn_choose"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Pilih"/>
</LinearLayout>
3. Pada activity_main.xml tambahkan lagi satu Button dan satu TextView yang akan kita
gunakan untuk menjalankan MoveForResultActivity, Sehingga layout activity_main.xml
yang kita punya menjadi seperti ini :
4. Setelah selesai, kita lanjut garap berkas MainActivity.java. Buka berkasnya dan sesuaikan
kodenya sebagai berikut.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveActivity = (Button) findViewById(R.id.btn_move_activity);
btnMoveActivity.setOnClickListener(this);
btnMoveWithDataActivity =
(Button)findViewById(R.id.btn_move_activity_data);
btnMoveWithDataActivity.setOnClickListener(this);
btnMoveWithObject =
(Button)findViewById(R.id.btn_move_activity_object);
btnMoveWithObject.setOnClickListener(this);
btnDialPhone = (Button)findViewById(R.id.btn_dial_number);
btnDialPhone.setOnClickListener(this);
btnMoveForResult = (Button)findViewById(R.id.btn_move_for_result);
btnMoveForResult.setOnClickListener(this);
tvResult = (TextView)findViewById(R.id.tv_result);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_move_activity:
Intent moveIntent = new Intent(MainActivity.this,
MoveActivity.class);
startActivity(moveIntent);
break;
case R.id.btn_move_activity_data:
Intent moveWithDataIntent = new Intent(MainActivity.this,
MoveWithDataActivity.class);
5. Setelah selesai, pastikan tidak ada bagian kode yang tertinggal. Jalankan kembali
aplikasinya, dan coba Anda pilih tombol ‘Pindah Activity untuk Result’. Pilih angka yang
Anda suka dan lihat hasilnya. Di MainActivity.java sudah ada angka yang tadi Anda pilih di
obyek textiew tvResult.
Perbedaan mendasar antara perpindahan activity untuk menghasilkan nilai balik dengan tidak
adalah pada metode untuk menjalankan obyek intent-nya. Sebelumnya kita menggunakan
startActivity(Intent) untuk berpindah activity. Kali ini kita menggunakan
startActivityForResult(Intent, RequestCode).
Pada baris diatas, kita akan menjalankan sebuah activity melalui intent untuk nilai balik ke
activity yang menjalankan di mana nilai REQUEST_CODE adalah 110. Penentuan nilai 110 itu
dibebaskan dan kalau bisa disesuaikan dengan kebutuhan pengembangan aplikasi.
Kemudian, pada MoveForResultActivity kita memilih satu angka yang kita suka, Sebagai contoh
angka 150. Kemudian tekanlah tombol ‘Pilih’. Maka baris kode dibawah ini akan dijalankan.
1. @Override
2. public void onClick(View v) {
3. if (v.getId() == R.id.btn_choose){
4. if (rgNumber.getCheckedRadioButtonId() != 0){
5. int value = 0;
6. switch (rgNumber.getCheckedRadioButtonId()){
7. case R.id.rb_50:
8. value = 50;
9. break;
10. case R.id.rb_100:
11. value = 100;
12. break;
13. case R.id.rb_150:
14. value = 150;
15. break;
16. case R.id.rb_200:
17. value = 200;
18. break;
19. }
20. Intent resultIntent = new Intent();
21. resultIntent.putExtra(EXTRA_SELECTED_VALUE, value);
22. setResult(RESULT_CODE, resultIntent);
23. finish();
24. }
25. }
Di mana akan divalidasi terlebih dahulu apakah ada nilai dari obyek RadioButton yang dipilih.
Bila ada, maka proses selanjutnya menentukan obyek RadioButton mana yang diklik
berdasarkan nilai dari rgNumber.getCheckedRadioButtonId().
Mengapa kita tidak memeriksa langsung ke obyek RadioButton? Karena kita menggunakan
RadioGroup sebagai parent pada obyek-obyek RadioButton. Secara otomatis kita bisa
mendapatkan mana obyek RadioButton yang dipilih dengan
rgNumber.getCheckedRadioButtonId().
1. <RadioGroup
2. android:id="@+id/rg_number"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:orientation="vertical">
6. <RadioButton
7. android:id="@+id/rb_50"
8. android:layout_width="match_parent"
9. android:layout_height="wrap_content"
10. android:text="50"
11. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
12. <RadioButton
13. android:id="@+id/rb_100"
14. android:layout_width="match_parent"
15. android:layout_height="wrap_content"
16. android:text="100"
17. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
18. <RadioButton
19. android:id="@+id/rb_150"
20. android:layout_width="match_parent"
21. android:layout_height="wrap_content"
22. android:text="150"
23. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
24. <RadioButton
25. android:id="@+id/rb_200"
26. android:layout_width="match_parent"
27. android:layout_height="wrap_content"
28. android:text="200"
29. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
30. </RadioGroup>
Selanjutnya, ketika sudah didapatkan nilainya, maka baris ini akan dieksekusi:
Kita membuat sebuah intent tanpa ada inputan apapun di konstruktornya. Kemudian kita
meletakkan variabel value kedalam metode putExtra(Key, Value) dengan
EXTRA_SELECTED_VALUE bertipekan static string dan bernilai “extra_selected_value”.
Kemudian kita jadikan obyek resultIntent yang telah dibuat sebelumnya menjadi parameter dari
setResult(RESULT_CODE, Intent).
1. @Override
2. protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
Di sinilah MainActivity akan merespon terhadap nilai balik yang dikirimkan oleh
MoveForResultActivity. Pada baris 4 di atas, dilakukan perbandingan apakah requestCode sama
dengan yang dikirimkan oleh MainActivity.
Kemudian pada baris 5, diperiksa apakah nilai resultCode sama dengan resultCode yang dikirim
oleh MoveForResultActivity. Bila iya, maka data RadioButton yang dipilih akan ditampilkan di
textview tvResult.
Pada realita sehari-hari, konsep yang barusan kita pelajari ini akan bersinggungan dengan
aplikasi native lainnya. Misalnya, jika aplikasi kita membutuhkan gambar yang diambil dari
kamera atau gallery photo. Tentu kita mengharapkan nilai balik berupa alamat foto yang dapat
diterima oleh activityyang menjalankan. Begitu juga jika kita membutuhkan data kontak yang
berasal dari aplikasi phonebook bawaan peranti Android.
Untuk lebih dalam lagi silakan pelajari materi pada link berikut:
Intent Result
Keren! Anda sudah belajar dasar-dasar penggunaan intent secara umum di proyek aplikasi
Android. 4 intent secara eksplisit dan 1 secara implisit dengan satu di antaranya mencakup nilai
balik dari activityyang dijalankan.
Intent Filters
3. Latihan Fragment
Tujuan
Agar Anda dapat lebih memahami topik fragment, akan ada beberapa codelab yang akan
Anda lakukan.
1. Pada activity_main.xml, silakan kondisikan kode pada berkas tersebut menjadi seperti
berikut :
3. Setelah tampil dialog untuk fragment, isikan HomeFragment pada kolom Fragment Name
dan uncheck untuk kedua pilihan (Include fragment factory methods dan include interface
callbacks) seperti gambar dibawah ini. Klik Finish untuk melanjutkan penciptaan fragment.
Akan terjadi error pada tools:context. Tenang, yang perlu Anda lakukan adalah
menyesuaikannya dengan nama activity dan ditambahkan dengan nama package dari
project Anda.
Untuk mengatasi tanda merah pada class, jangan lupa untuk tekan (Alt + Enter) untuk import kel
7. Sekarang, setelah selesai semua, silakan jalankan aplikasi Anda dan hasilnya haruslah seperti ini.
Ketika aplikasi dijalankan, aplikasi akan menampilkan satu text dan satu button yang
dimana kedua komponen tersebut dimiliki oleh HomeFragment.
FrameLayout memiliki sifat sebagai berikut: semua komponen view di dalam FrameLayout
bersifat menumpuk. Bila pada suatu hirarki FrameLayout terdapat satu view dengan posisi
paling atas, maka view tersebut akan menjadi alas untuk view di atasnya. Gambarannya sebagai
berikut:
Dengan karakteristik seperti ini, FrameLayout merupakan sebuah layout yang paling optimal dalam
proses manipulasi penampilan obyek fragment ke layar pengguna.
Pada HomeFragment.java terdapat metode onCreateView() dimana layout interface didefinisikan dan
ditransformasi dari layout berupa file xml kedalam obyek view dengan menggunakan metode inflate().
Inflater.inflate() merupakan obyek dari LayoutInflater yang berfungsi untuk mengubah layout
xml ke dalam bentuk obyek viewgroup atau widget melalui pemanggilan metode inflate().
Isian dari tiga parameter yang terdapat pada metode inflate() berdasarkan dari :
Boolean attachToRoot : Apakah kita akan menempelkan layout kita ke dalam root dari parent
layout yang ada. Jika ya, maka akan ditempelkan kedalam parent layout yang ada. Jika tidak, maka hanya
akan menghasilkan nilai balik dalam bentu obyek view saja.
Kita memilih false pada attachToRoot karena pada kode ini kita ingin menambahkan event onclick pada
button-nya. Maka kita membutuhkan nilai balik berupa view.
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, disini casting obyek Button
dilakukan dengan (Button)view.findViewById(R.id.btn_category). Kode tersebut menandakan
btn_category berada pada obyek view dimana obyek view berasal dari konversi fragment_home.xml.
Bila hanya (Button)findViewById(R.id.btn_category), maka btn_category berada pada root layout,
activity_main.xml.
Sekarang pada MainActivity.java kita lakukan proses penempelan atau pemasangan obyek
HomeFragment sehingga dapat ditampilkan ke layar dengan mekanisme sebagai berikut :
Dimana,
Fragment Manager
FragmentTransaction merupakan api untuk melakukan operasi pada fragment seperti add(), replace(),
commit() dsb.
Fragment Transaction
Disinilah proses manipulasi penambahan fragment kedalam activity terjadi. Metode add() akan
menambahkan obyek fragment kedalam layout container. Layout container ini merupakan obyek
FrameLayout dengan ID frame_container. Ia memiliki tag dengan nama kelas dari HomeFragment itu
sendiri.
Baris diatas akan meminta obyek mFragmentTransaction untuk melakukan pemasangan obyek secara
asynchronous untuk ditampilkan ke antar muka pengguna (user interface).
Selanjutnya, kita akan membuat sebuah fragment lagi untuk melihat bagaimana sebuah
tampilan bisa dengan fleksibel berubah di dalam satu activity, tanpa berpindah halaman. Buat
kembali fragment baru dengan nama CategoryFragment dengan cara yang sama seperti
sebelumnya. Jangan lupa untuk meng-uncheck pilihan untuk generate default methods dan
callbacks.
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. android:padding="16dp"
7. tools:context="com.studio.erlangga.myflexiblefragment.CategoryFragment
">
8. <TextView
9. android:layout_width="match_parent"
10. android:layout_height="wrap_content"
11. android:text="Ini halaman Category"
12. android:layout_marginBottom="@dimen/activity_horizontal_margin"
/>
13. <Button
14. android:id="@+id/btn_detail_category"
15. android:layout_width="match_parent"
16. android:layout_height="wrap_content"
17. android:text="Kategory Lifestyle"/>
2. Setelah selesai dengan layout xml, sekarang pada file CategoryFragment.java modifikasi
kodenya menjadi sebagai berikut :
3. Pada langkah diatas kita sedang menyiapkan langkah selanjutnya, bagaimana kita bisa
mengirimkan data dari satu fragment ke fragment lain. Sekarang pada HomeFragment
tambahkan baris berikut pada method onClick().
23. mFragmentTransaction.commit();
24. }
25. }
26. }
5. Setelah selesai, silakan jalankan aplikasi lagi dan coba klik tombol Ke Halaman
Category, aplikasi sudah berpindah tampilan tanpa berpindah activity!
Anda telah belajar bagaiman berpindah tampilan tanpa harus berpindah activity, dengan
fragment hal tersebut menjadi terlihat mudah. Mari kita breakdown satu persatu hal baru yang
baru saja Anda tulis :
Ada yang beda disini, kita menggunakan method replace() dan bukan add() ketika ingin
menempelkan sebuah fragment baru. Ya, dengan parameter input yang sama pada method
add(), method replace() akan mengganti obyek fragment yang sedang tampil saat ini,
HomeFragment dengan obyek fragment yang baru, CategoryFragment.
1. mFragmentTransaction.replace(R.id.frame_container, mCategoryFragment,
CategoryFragment.class.getSimpleName());
Sekarang, jika Anda menghapus baris tersebut dan menjalankan ulang aplikasi Anda, pasti Anda
akan melihat bahwa ketika Anda mengklik tombol back pada peranti Anda, aplikasi akan
langsung tertutup.
Kita telah belajar bagaimana berpindah dari satu fragment ke fragment lain, kurang lengkap
rasanya jika kita belum tahu bagaimana berpindah fragment dengan membawa data. Terdapat
dua cara, 1. Dengan menggunakan obyek Bundle dan 2. Dengan menggunakan setter dan
getter. Mari kita langsung praktek untuk kedua cara tersebut.
1. Buat Fragment lagi dengan cara yang sama dengan nama DetailCategoryFragment. Pada
fragment_detail_category.xml sesuaikan kodenya menjadi seperti berikut:
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
"
3. xmlns:tools="http://schemas.android.com/tools"
4. android:layout_width="match_parent"
5. android:layout_height="match_parent"
6. android:padding="16dp"
7. android:orientation="vertical"
8. tools:context="com.dicoding.associate.myflexiblefragment.DetailCateg
oryFragment">
9. <TextView
10. android:id="@+id/tv_category_name"
11. android:layout_width="match_parent"
12. android:layout_height="wrap_content"
55. tvCategoryDescription =
(TextView)view.findViewById(R.id.tv_category_description);
56. btnProfile = (Button)view.findViewById(R.id.btn_profile);
57. btnProfile.setOnClickListener(this);
58. btnShowDialog =
(Button)view.findViewById(R.id.btn_show_dialog);
59. btnShowDialog.setOnClickListener(this);
60. return view;
61. }
62. @Override
63. public void onActivityCreated(@Nullable Bundle savedInstanceState)
{
64. super.onActivityCreated(savedInstanceState);
65. String categoryName = getArguments().getString(EXTRA_NAME);
66. tvCategoryName.setText(categoryName);
67. tvCategoryDescription.setText(getDescription());
68. }
69. @Override
70. public void onClick(View v) {
71. switch (v.getId()){
72. case R.id.btn_profile:
73. break;
74. case R.id.btn_show_dialog:
75. break;
76. }
77. }
78. }
Kode diatas akan mendemonstrasikan bagaimana melakukan penampilan data yang dikirim
melalui perpindahan fragment.
79. Baik, tinggal selangkah lagi proses implementasi dari pengiriman data melalui perpindahan
fragment selesai, sekarang buka kembali CategoryFragment.java lalu tambahkan baris
berikut pada method onClick().
80. Override
81. public void onClick(View v) {
82. if (v.getId() == R.id.btn_detail_category){
83. DetailCategoryFragment mDetailCategoryFragment = new
DetailCategoryFragment();
84. Bundle mBundle = new Bundle();
85. mBundle.putString(DetailCategoryFragment.EXTRA_NAME,
"Lifestyle");
86. String description = "Kategori ini akan berisi produk-produk
lifestyle";
87. mDetailCategoryFragment.setArguments(mBundle);
88. mDetailCategoryFragment.setDescription(description);
89. FragmentManager mFragmentManager = getFragmentManager();
90. FragmentTransaction mFragmentTransaction =
mFragmentManager.beginTransaction();
91. mFragmentTransaction.replace(R.id.frame_container,
mDetailCategoryFragment,
92. DetailCategoryFragment.class.getSimpleName());
93. mFragmentTransaction.addToBackStack(null);
94. mFragmentTransaction.commit();
95. }
96. }
27. DetailCategoryFragment.class.getSimpleName());
28. mFragmentTransaction.addToBackStack(null);
29. mFragmentTransaction.commit();
30. }
31. }
32. }
97. Sekarang, setelah selesai semua, silakan Anda jalankan aplikasinya untuk melihat hasil dari
kode yang diatas. Seharusnya ketika Anda mengklik tombol Kategory Lifestyle pada
CategoryFragment akan ada data yang dikirimkan sewaktu perpindahan fragment yang itu
melalui object bundle dan mekanisme metode setter and getter. Tampilan aplikasi Anda
sekarang sudah menjadi seperti ini.
Mantap, Anda sekarang sudah bisa berpindah dari satu fragment ke fragment lain dengan
mengirimkan data. Ya seperti yang sudah dijelaskan diawal, kita memiliki dua mekanisme dalam
mengirimkan data antar fragment yaitu:
Erlangga, S.Kom., M.T. 96
Departemen Pendidikan Ilmu Komputer
Fakultas Pendidikan Matematika dan Ilmu Pengetahuan Alam (FPMIPA)
MODUL PEMBELAJARAN MATA KULIAH KEAHLIAN REKAYASA
PERANGKAT LUNAK
IK322 – MOBILE PROGRAMING
Pada kode diatas, kita menggunakan obyek Bundle untuk mengirimkan data antar fragment,
perhatikan cara yang digunakan sama dengan cara yang telah kita implementasikan
sebelumnya di Activity. Setelah dibuat obyeknya dan data yang mau dikirimkan apa kemudian
kita hanya perlu menambahkan sebaris kode berikut :
1. mDetailCategoryFragment.setArguments(mBundle);
Dan cara mengambil data yang dikirimkan melalui obyek Bundle pada Fragment tujuan
sangatlah mudah hanya dengan memanggil metode getArguments() di fragment
DetailCategoryFragment seperti berikut :
Kelas Bundle merupakan kelas map data string untuk obyek-obyek parcelable. Di sini kita bisa
menginputkan lebih dari satu parameter/variabel ke dalam obyek Bundle.
Kelas fragment adalah kelas java pada umumnya, dengan menggunakan metode setter dan
getter untuk mengirimkan parameter/variabel dari satu fragment ke fragment lainnya. Seperti
baris berikut :
Cara menggunakannya juga cukup mudah, hanya dengan menempatkan value yang ingin
dikirimkan via metode setter lalu diambil dengan menggunakan metode getter seperti pada
baris berikut :
1. tvCategoryDescription.setText(getDescription());
Mudah kan? dua cara diatas sudah umum dilakukan dan diimplementasikan ke dalam project
pengembangan aplikasi android. Selamat! Sejauh ini Anda sudah memahami lebih jauh tentang
Fragment dari bagaimana membuat, menempelkan ke activity hingga berpindah antar fragment
dengan atau tidak membawa data.
Selanjutnya kita masuk ke pemanfaatan fragment untuk menampilkan sebuah custom dialog.
Kita akan menggunakan DialogFragment lengkap dengan interaksinya. Siap? Ayo kita lanjutkan
ngodingnya.
1. Baik sekarang buat kembali satu kelas Fragment dengan nama OptionDialogFragment,
jangan lupa untuk uncheck pilihan include fragment factory methods dan include interface
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="wrap_content"
5. android:orientation="vertical"
6. android:padding="@dimen/activity_vertical_margin"
7. tools:context="com.dicoding.associate.myflexiblefragment.OptionDialo
gFragment">
8. <TextView
9. android:layout_width="match_parent"
10. android:layout_height="wrap_content"
11. android:text="Siapa pelatih tersukses Machester United?"
12. android:layout_marginBottom="@dimen/activity_vertical_margin"/>
13. <RadioGroup
14. android:id="@+id/rg_options"
15. android:layout_width="match_parent"
16. android:layout_height="wrap_content"
17. android:orientation="vertical">
18. <RadioButton
19. android:id="@+id/rb_saf"
20. android:layout_width="match_parent"
21. android:layout_height="wrap_content"
22. android:text="Sir Alex Ferguson"
23. android:layout_marginBottom="@dimen/activity_vertical_margi
n"/>
24. <RadioButton
25. android:id="@+id/rb_mou"
26. android:layout_width="match_parent"
27. android:layout_height="wrap_content"
28. android:text="Jose Mourinho"
29. android:layout_marginBottom="@dimen/activity_vertical_margi
n"/>
30. <RadioButton
31. android:id="@+id/rb_lvg"
32. android:layout_width="match_parent"
33. android:layout_height="wrap_content"
34. android:text="Louis Van Gaal"
35. android:layout_marginBottom="@dimen/activity_vertical_margi
n"/>
36. <RadioButton
37. android:id="@+id/rb_moyes"
38. android:layout_width="match_parent"
39. android:layout_height="wrap_content"
40. android:text="David Moyes"
41. android:layout_marginBottom="@dimen/activity_vertical_margi
n"/>
42. </RadioGroup>
43. <LinearLayout
44. android:layout_width="match_parent"
45. android:layout_height="wrap_content"
46. android:orientation="horizontal">
47. <Button
48. android:id="@+id/btn_close"
49. android:layout_width="match_parent"
50. android:layout_height="wrap_content"
51. android:layout_weight="0.5"
52. android:text="Tutup"
53. android:layout_marginRight="4dp"/>
54. <Button
55. android:id="@+id/btn_choose"
56. android:layout_width="match_parent"
57. android:layout_height="wrap_content"
58. android:layout_weight="0.5"
59. android:text="Pilih"
60. android:layout_marginLeft="4dp"/>
61. </LinearLayout>
62. </LinearLayout>
2. Setelah selesai dengan berkas layout xml sekarang, lanjutkan ngoding untuk
OptionDialogFragment. Kondisikan, kodenya menjadi sebagai berikut :
17. @Override
18. public View onCreateView(LayoutInflater inflater, ViewGroup
container,
19. Bundle savedInstanceState) {
20. // Inflate the layout for this fragment
21. View view
= inflater.inflate(R.layout.fragment_detail_category, container,
false);
22. tvCategoryName =
(TextView)view.findViewById(R.id.tv_category_name);
23. tvCategoryDescription =
(TextView)view.findViewById(R.id.tv_category_description);
24. btnProfile = (Button)view.findViewById(R.id.btn_profile);
25. btnProfile.setOnClickListener(this);
26. btnShowDialog =
(Button)view.findViewById(R.id.btn_show_dialog);
27. btnShowDialog.setOnClickListener(this);
28. return view;
29. }
30. @Override
31. public void onActivityCreated(@Nullable Bundle savedInstanceState)
{
32. super.onActivityCreated(savedInstanceState);
33. String categoryName = getArguments().getString(EXTRA_NAME);
34. tvCategoryName.setText(categoryName);
35. tvCategoryDescription.setText(getDescription());
36. }
37. @Override
38. public void onClick(View v) {
39. switch (v.getId()){
40. case R.id.btn_profile:
41. break;
42. case R.id.btn_show_dialog:
43. OptionDialogFragment mOptionDialogFragment = new
OptionDialogFragment();
44. mOptionDialogFragment.setOnOptionDialogListener(new
OptionDialogFragment.OnOptionDialogListener() {
45. @Override
46. public void onOptionChoosen(String text) {
47. Toast.makeText(getActivity(), text,
Toast.LENGTH_SHORT).show();
48. }
49. });
50. FragmentManager mFragmentManager =
getChildFragmentManager();
51. mOptionDialogFragment.show(mFragmentManager,
OptionDialogFragment.class.getSimpleName());
52. break;
53. }
54. }
55. }
22. Sekarang jalankan kembali aplikasi dan klik pada tombol Tampilkan sebuah dialog dan
hasilnya akan muncul obyek OptionDialogFragment yang baru saja kita buat, dan coba
Anda pilih salah satu option yang ada dan klik tombol Pilih, lihat hasil dari yang kita pilih
tampil ke dalam bentuk soft message (Toast).
Sama dengan obyek fragment seperti sebelumnya, di sini kelas fragment yang kita buat inherit
ke DialogFragment. Dengan begitu, obyek fragment sekarang merupakan obyek dialog yang
akan tampil mengambang dilayar, seperti pada obyek modal pada platform lain, obyek
DialogFragment dapat disesuaikan tampilan dan fungsinya secara spesifik. Di sini kita
menampillkan sebuah dialog ke pengguna untuk memilih sebuah opsi yang disediakan.
Pada proses pemanggilannya pun hampir sama dengan yang kita lakukan sebelumnya. Namun
perbedaanya ada disini.
1. mOptionDialogFragment.show(mFragmentManager,
OptionDialogFragment.class.getSimpleName());
Untuk proses handling event ketika tombol Pilih pada OptionDialogFragment diklik, kita
menggunakan implementasi interface. Bagi yang belum paham tentang definisi interface pada
pemrograman java berikut definisi singkatnya.
Interface adalah sebuah kelas yang terdiri kumpulan method yang hanya memuat deklarasi
dan struktur method, tanpa detail implementasinya.
Interface
Kelas interface yang kita punya pada OptionDialogFragment adalah sebagai berikut :
1. mOptionDialogFragment.setOnOptionDialogListener(new
OptionDialogFragment.OnOptionDialogListener() {
2. @Override
3. public void onOptionChoosen(String text) {
4. Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT).show();
5. }
6. });
Jadi ketika pengguna mengklik tombol Pilih setelah mengklik salah satu pilihan, baris ini akan
dieksekusi :
1. getOnOptionDialogListener().onOptionChoosen(coach);
Yang kemudian, metode onOptionChoosen() pada baris ini akan dipanggil untuk menampilkan
nilai dari pilihan yang dipilih pada Toast.
1. mOptionDialogFragment.setOnOptionDialogListener(new
OptionDialogFragment.OnOptionDialogListener() {
2. @Override
3. public void onOptionChoosen(String text) {
4. Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT).show();
5. }
6. });
Cool, sejauh ini kami harap Anda sudah lebih memahami tentang bentuk dan implementasi
fragment seperti apa. Terakhir sebelum sesi ini selesai kita akan belajar bagaimana
menjalankan sebuah Activity dari fragment. Caranya pun hampir sama dengan apa yang telah
kita pelajari di Activity.
Sekarang, buat sebuah Activity dengan nama ProfileActivity dan setelah terbentuk, pada
activity_profile.xml kondisikan kode yang ada menjadi sebagai berikut :
3. xmlns:tools="http://schemas.android.com/tools"
4. android:layout_width="match_parent"
5. android:layout_height="match_parent"
6. android:paddingBottom="@dimen/activity_vertical_margin"
7. android:paddingLeft="@dimen/activity_horizontal_margin"
8. android:paddingRight="@dimen/activity_horizontal_margin"
9. android:paddingTop="@dimen/activity_vertical_margin"
10. tools:context="com.dicoding.associate.myflexiblefragment.ProfileAct
ivity">
11. <TextView
12. android:layout_width="match_parent"
13. android:layout_height="wrap_content"
14. android:text="Ini Profile Activity"/>
15. </RelativeLayout>
Setelah selesai semua, coba jalankan aplikasi Anda dan klik tombol Ke Halaman Profile Activity.
Akhirnya, setelah melalui banyak perjuangan dan barisan kode yang Anda tulis sekarang Anda
sudah berhasil memahami bagaimana komponen fragment bekerja. Selanjutnya, akan ada
codelab tentang implementasi lanjut dari fragment. Ayo kita lanjut lagi, Semangat Ngoding!