Mengembalikan Hasil dari Suatu Intent

Dalam latihan sebelumnya [Menghubungkan Antar Activity Menggunakan Intent], method 'startActivity()' memanggil activity yang lain tetapi tidak mengembalikan hasil apapun ke activity yang memanggil. Misalnya, kita mungkin memiliki activity yang akan mengajukan ke user 'nama dan password'. Informasi yang dimasukkan user dalam activity tersebut perlu dikembalikan ke activity yang memanggil untu diproses lebih lanjut. Bila kita melewatkan kembali data dari suatu activity, sebagai gantinya kita akan menggunakan method 'startActivityForResult()' (dan bukan 'startActivity()'). Berikut adalah latihan untuk dicoba.

1. Masih menggunakan project yang sama seperti latihan sebelumnya, kita modifikasi file layout pada "secondactivity.xml" 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/asecondactivity"
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="vertical"
tools:context="com.example.usingintent.SecondActivity">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Ini adalah activity kedua" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Silahkan isi nama Anda" />

<EditText
android:id="@+id/txt_username"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btn_OK"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="OK"
android:onClick="onClick"/>
</LinearLayout>

2. Kita modifikasi dan tambahkan kode berikut pada "SecondActivity.java":
package com.example.usingintent;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;

public class SecondActivity extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
}

public void onClick(View v) {
Intent data = new Intent();

/*ambil EditText*/
EditText txt_username = (EditText) findViewById(R.id.txt_username);

/*tentukan data untuk dikembalikan*/
data.setData(Uri.parse(txt_username.getText().toString()));
setResult(RESULT_OK, data);

/*akhiri activity ini*/
finish();
}
}
3. Kemudian kita modifikasi kode pada file utama "MainActivity.java" seperti berikut:
package com.example.usingintent;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

int request_Code = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void onClick(View v) {
/*startActivity(new Intent("com.example.usingintent.SecondActivity"));*/
startActivityForResult(new Intent("com.example.usingintent.SecondActivity"), request_Code);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == request_Code) {
if (resultCode == RESULT_OK) {
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();
}
}
}
}

4. Jalankan di emulator Android Studio. Bila activity pertama di-tampilkan, klik tombolnya. Activity kedua akan tampil sekarang. Kemudian isikan nama dan klik tombok "OK". Activity pertama akan menampilkan nama yang dimasukkan sebelumnya dengan menggunakan class 'Toast', seperti gambar berikut di bawah ini:



Penjelasan:

Untuk memanggil suatu activity dan menunggu hasil yang akan dikembalikannya, kita perlu menggunakan method 'startActivityForResult()' seperti berikut:
startActivityForResult(new Intent("com.example.usingintent.SecondActivity"), request_Code);
Selain melewatkan parameter object 'Intent', kita juga perlu melewatkan parameter 'request code'. Request code ini sederhananya adalah suatu nilai integer yang mengidentifikasi activity yang kita panggil. Kode ini diperlukan karena bila suatu activity mengembalikan suatu nilai, kita harus punya cara untuk mengidentifikasinya. Misalnya, kita mungkin memanggil banyak activity pada saat yang sama, dan beberapa activity mungkin tidak merespon dengan segera (misalnya menunggu jawaban dari suatu server). Bila activity merespon, kita perlu request code tersebut untuk menentukan activity mana yang merespon ini.
Catatan:
Bila request code di-set ke -1, maka memanggilnya dengan menggunakan method 'startActivityForResult()' akan sama dengan memanggilnya menggunakan method 'startActivity()', yaitu tidak akan ada hasil yang dikemballikan.
Supaya suatu activity mengembalikan suatu nilai ke activity yang memanggilnya, kita gunakan object 'Intent' untuk mengirim data kembali melalui method 'setData()':
Intent data = new Intent();

/*ambil EditText*/
EditText txt_username = (EditText) findViewById(R.id.txt_username);

/*tentukan data untuk dikembalikan*/
data.setData(Uri.parse(txt_username.getText().toString()));
setResult(RESULT_OK, data);

/*akhiri activity ini*/
finish();

Method 'setResult()' akan menetapkan 'result code' (entah 'RESULT_OK' atau 'RESULT_CANCELED') dan data (object 'Intent') dikembalikan ke activity yang memanggilnya.

Di dalam activity yang memanggil, kita perlu mengimplementasikan method 'onActivityResult()', yang dipanggil kapan saja suatu activity mengembalikan hasil:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == request_Code) {
if (resultCode == RESULT_OK) {
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();
}
}
}
Disitu kita men-cek 'request code' dan 'result code' dan menampilkan hasil ayng dikembalikan. Hasil yang dikembalikan dilewatkan melalui parameter 'data', dan kita mendapatkan detilnya melalui method 'getData()'.

No comments: