Membuat Single Android Activity untuk Beragam Mode

Aldi Fahrezi
temancatat
Published in
3 min readMay 2, 2018

Komponen utama dalam aplikasi Android yang berfungsi untuk menampilkan UI dan menerima interaksi user disebut sebagai Activity. Satu instance komponen ini merepresentasikan satu halaman UI / page pada aplikasi Android. Komponen ini akan menerima interaksi pengguna dan menentukan apa yang harus dilakukan oleh aplikasi, baik itu melakukan pengisian form, membuka Activity baru, dsb.

Dalam mendesign aplikasi, tidak jarang kita menemukan bahwa akan terdapat beberapa halaman UI yang serupa namun memberikan fungsionalitas yang berbeda. Contohnya, dalam aplikasi yang kami kembangkan (aplikasi pencatatan transaksi), tampilan UI dalam membuat transaksi, mengedit transaksi, dan melihat transaksi memiliki layout UI yang serupa namun dengan beberapa modifikasi.

Lihat dan Edit Transaksi
Tambah Transaksi

Daripada kita membuat tiga Activity berbeda untuk masing-masing UI, ada baiknya kita membuat satu Activity yang memiliki konsep multi-mode (dalam contoh sebelumnya merujuk pada create, view, dan edit mode).

Artikel ini akan menjelaskan bagaimana pengembangan Activity dengan multi-mode dapat dilakukan melalui pemanfaatan informasi Intent yang digunakan dalam pemanggilan Activity.

Creating Intent with Mode Information

Dalam menampilkan dan menjalankan sebuah Activity, dibutuhkan suatu Intent. Selain menentukan Activity apa yang akan kita jalankan, Intent juga berisi berbagai informasi tambahan yang dapat kita berikan. Activity yang akan dijalankan dapat mengakses informasi dari Intent yang diberikan sebelum menampilkan layout UI (lebih tepatnya bisa diakses pada tahapan onCreate suatu Activity).

Berikut contoh cuplikan kode di mana kita memberikan informasi mode pada Intent yang nantinya dapat digunakan oleh Activity yang dipanggil untuk menyesuaikan UI yang ditampilkannya.

public void viewTransaction(String transactionId) {
Intent intent = new Intent(this, AddTransactionActivity.class);
intent.putExtra("EXTRA_TRANSACTION_ID", transactionId);
intent.putExtra("EXTRA_MODE", "VIEW");

this.startActivity(intent);
}

public void editTransaction(String transactionId) {
Intent intent = new Intent(this, AddTransactionActivity.class);
intent.putExtra("EXTRA_TRANSACTION_ID", transactionId);
intent.putExtra("EXTRA_MODE", "EDIT");

this.startActivity(intent);
}

public void createTransaction() {
// Default Mode without extra intent information
Intent intent = new Intent(this, AddTransactionActivity.class);

this.startActivity(intent);
}

Mode CREATE merupakan default mode sehingga tidak membutuhkan informasi tambahan

Using Intent Mode Information for Customizing UI

Dengan adanya informasi tambahan yang diberikan dalam Intent, kita dapat mengakses informasi mode dalam Activity tahap onCreate (sebelum layout ditampilkan) untuk menyesuaikan layout dan fungsionalitas yang akan ditampilkan. Dalam aplikasi kami, beberapa penyesuaian yang terjadi adalah sebagai berikut:

  • Pengubahan sifat editable dari EditText yang terdapat dalam layout (sebagai input form) bergantung pada mode yang diberikan.
  • Pengubahan fungsionalitas submisi form dari membuat sebuah transaksi baru menjadi mengedit transaksi yang sudah ada.
  • Visibility button Simpan, icon Delete, icon Edit, dsb. juga bergantung pada mode.
  • Terakhir, untuk mode view dan edit, form transaksi perlu di-prepopulate dengan data yang sudah ada.

Berikut adalah cuplikan kode Activity yang berfungsi untuk menangani kasus-kasus tersebut.

Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_transaction);

String mode = getIntent().getStringExtra("EXTRA_MODE");
if (mode == null) { // CREATE mode
renderCreateMode();
} else if (mode.equals("VIEW")) {
renderViewMode(
getIntent().getStringExtra("EXTRA_TRANSACTION_ID")
);
} else if (mode.equals("EDIT")) {
renderEditMode(
getIntent().getStringExtra("EXTRA_TRANSACTION_ID")
);
}
}

public void renderViewMode(String transactionId) {
displayMenuItems(); // Display navbar menu icons

getSupportActionBar().setTitle(
getResources().getString(R.string.view_transaction_menu)
); // Change title to "Lihat Transaksi"

footer.setVisibility(View.GONE); // Hide footer

prefillFormData(transactionId); // Prefill data form

disableForm(); // Form tidak editable
}

public void renderEditMode(String transactionId) {
displayMenuItems(); // Display navbar menu icons

getSupportActionBar().setTitle(
getResources().getString(R.string.edit_transaction_menu)
); // Change title to "Edit Transaksi"

footer.setVisibility(View.VISIBLE); // Tampilkan footer

prefillFormData(transactionId); // Prefill data form

enableForm(); // Form editable
}

public void renderCreateMode() {
hideMenuItems(); // Hide navbar menu icons

getSupportActionBar().setTitle(
getResources().getString(R.string.new_transaction_menu)
); // Change title to "Tambah Transaksi"

footer.setVisibility(View.VISIBLE); // Tampilkan footer

enableForm(); // Form editable
}

Untuk beberapa page UI yang memiliki layout serupa, telah ditunjukkan bahwa kita hanya perlu membuat satu Activity. Activity tersebut dapat melakukan sedikit modifikasi agar layout dan fungsionalitas yang sesuai dapat dihasilkan berdasarkan informasi mode yang terkandung pada Intent. Namun, tergantung dari kebutuhan aplikasi yang dikembangkan, tidak menutup kemungkinan apabila untuk masing-masing mode dibuat Activity yang berbeda, terlebih jika tampilan UI untuk setiap mode berbeda dengan sangat jauh.

--

--