Melewatkan Data Menggunakan Object Intent

Selain mengembalikan data dari suatu activity, hal lain yang umum dilakukan adalah melewatkan data ke suatu activity. Misalnya, dalam contoh sebelumnya kita mungkin ingin men-set suatu teks default di dalam 'EditText' sebelum activity ditampilkan. Dalam hal ini, kita bisa menggunakan object Intent untuk melewatkan data ke activity yang menjadi target. Berikut di bawah ini adalah latihan bagaimana kita bisa menggunakan object Intent untuk melewatkan data diantara activity.

1. Kita buat project baru dengan nama "MelewatkanData".

2. Kita tambahkan kode berikut dalam file "activity_main.xml":
<?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="vertical"
tools:context="com.example.melewatkandata.MainActivity">

<Button
android:id="@+id/btn_SecondActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click untuk ke Activity kedua"
android:onClick="onClick"/>
</LinearLayout>

3. Kita tambahkan ke project file layout xml baru untuk layout activity kedua dan kita beri nama "secondactivity.xml". Kemudian kita isikan kode seperti berikut:
<?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">

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

<Button
android:id="@+id/btn_MainActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Kembali ke activity utama"
android:onClick="onClick"/>

</LinearLayout>

4. Kita tambahkan file java baru ke project dan kita beri nama "SecondActivity.java". Kemudian kita isi dengan kode seperti berikut:
package com.example.melewatkandata; 
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.Toast;

public class SecondActivity extends AppCompatActivity {

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

/*ambil data yang dilewatkan menggunakan getStringExtra()*/
Toast.makeText(this, getIntent().getStringExtra("str1"), Toast.LENGTH_SHORT).show();

/*ambil data yang dilewatkan menggunakan getIntExtra()*/
Toast.makeText(this, Integer.toString(getIntent().getIntExtra("age1",0)),
Toast.LENGTH_SHORT).show();

/*ambil object Bundle yang dilewatkan*/
Bundle bundle = getIntent().getExtras();

/*ambil data menggunakan getString()*/
Toast.makeText(this, bundle.getString("str2"), Toast.LENGTH_SHORT).show();

/*ambil data menggunakan getInt()*/
Toast.makeText(this, Integer.toString(bundle.getInt("age2")), Toast.LENGTH_SHORT).show();

}

public void onClick(View v) {
/*gunakan object Intent untuk mengembalikan data*/
Intent i = new Intent();

/*gunakan putExtra() untuk mengembalikan suatu nilai*/
i.putExtra("age3", 45);

/*gunakan setData() untuk mengembalikan suatu nilai*/
i.setData(Uri.parse("Sesuatu yang dilewatkan kembali ke activity utama"));

/*set hasil dengan OK dan object Intent*/
setResult(RESULT_OK, i);

/*akhiri activity saat ini*/
finish();
}
}

5. Kita modifikasi dan tambahkan kode berikut pada file "AndroidManifest.xml" seperti berikut:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.melewatkandata">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:label="Activity Kedua"
android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.melewatkandata.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

</application>

</manifest>

6. Kita modifikasi dan tambahkan kode berikut ke file utama "MainActivity.java":
package com.example.melewatkandata;

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 {

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

public void onClick(View v) {
Intent i = new Intent("com.example.melewatkandata.SecondActivity");
/*gunakan putExtra() */
i.putExtra("str1", "Ini adalah string");
i.putExtra("age1", 25);

/*gunakan object Bundle untuk menambahkan pasangan nama/nilai*/
Bundle extras = new Bundle();
extras.putString("str2", "Ini adalah string yang lain");
extras.putInt("age2", 35);

/*tempelkan object Bundle ke object Intent*/
i.putExtras(extras);

/*start activity untuk mendapatkan hasilnya lagi*/
startActivityForResult(i, 1);
}

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
/*check apakah request code adalah 1*/
if (requestCode == 1) {
/*apakah result = OK*/
if (resultCode == RESULT_OK) {
/*ambil hasil menggunakan getIntExtra()*/
Toast.makeText(this, Integer.toString(data.getIntExtra("age3", 0)),
Toast.LENGTH_SHORT).show();

/*ambil hasil menggunakan getData()*/
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();
}
}
}

}
7. Jalankan di emulator Android Studio. 




Penjelasan

Meskipun app ini tidak terlalu menarik secara visualisasi, tetapi latihan ini memberikan ilustrasi penting tentang bagaimana melewatkan data antar activity.

Pertama, kita bisa menggunakan method 'putExtra()' dari suatu object Intent untuk menambahkan pasangan antara nama dan nilai data:
i.putExtra("str1", "Ini adalah string");
i.putExtra("age1", 25);
Kode tersebut menambahkan pasangan nama dan nilai data ke object Intent: satu berjenis 'string' dan satunya berjenis 'integer'.

Selain menggunakan method 'putExtra()', kita bisa juga membuat object Bundle dan kemudian menempelkannya menggunakan method 'putExtras()'. Anggap saja object Bundle sebagai object kamus--dia berisi sekumpulan/koleksi pasangan nama dan nilai data. Kode berikut membuat suatu object Bundle dan kemudian menambahkan dua pasang nama dan nilai data ke object tersebut. Kemudian object tersebut ditempelkan ke object Intent seperti berikut:
/ *gunakan object Bundle untuk menambahkan pasangan nama/nilai */
Bundle extras = new Bundle();
extras.putString("str2", "Ini adalah string yang lain");
extras.putInt("age2", 35);

/*tempelkan object Bundle ke object Intent*/
i.putExtras(extras);
Pada activity kedua, untuk mendapatkan data yang dikirim menggunakan object Intent, pertama kali kita harus mendapatkan object Intent dengan menggunakan method 'getIntent()'. Kemudian, kita panggil method 'getStringExtra()' untuk mendapatkan nilai string:
/*ambil data yang dilewatkan menggunakan getStringExtra()*/ 
Toast.makeText(this, getIntent().getStringExtra("str1"), Toast.LENGTH_SHORT).show();
Dalam hal ini, kita harus memanggil method yang tepat untuk mengambil pasangan nama dan nilai data berdasarkan jenis datanya. Untuk nilai integer, kita gunakan method 'getIntExtra()' (parameter kedua adalah nilai default bila tidak ada nilai yang disimpan dalam nama yang sudah ditentukan):
/*ambil data yang dilewatkan menggunakan getIntExtra()*/
Toast.makeText(this, Integer.toString(getIntent().getIntExtra("age1",0)),
Toast.LENGTH_SHORT).show();
Untuk mengambil object Bundle, kita gunakan method 'getExtras()':
/*ambil object Bundle yang dilewatkan*/
Bundle bundle = getIntent().getExtras();
Untuk mendapatkan pasangan nama dan nilai masing-masing, kita gunakan method yang tepat. Untuk nilai string, kita gunakan method 'getString()':
/*ambil data menggunakan getString()*/
Toast.makeText(this, bundle.getString("str2"), Toast.LENGTH_SHORT).show();
Demikian juga, kita akan gunakan method 'getInt()' untuk mengambil nilai integer:
/*ambil data menggunakan getInt()*/
Toast.makeText(this, Integer.toString(bundle.getInt("age2")), Toast.LENGTH_SHORT).show();
Cara lain untuk melewatkan data ke suatu activity adalah dengan menggunakan method 'setData()' (seperti dalam latihan sebelumnya), seperti berikut:
/*gunakan 'setData()' untuk mengembalikan suatu nilai*/
i.setData(Uri.parse("Sesuatu yang dilewatkan kembali ke activity utama"));
Biasanya, kita menggunakan method 'setData()' ke suatu object Intent yang akan bekerja (misalnya melewatkan suatu URL ke suatu object Intent sehingga dia bisa memanggil suatu browser web untuk menampilkan laman web).

Untuk mengambil data menggunakan method 'setData()', kita gunakan method 'getData()' (dalam contoh ini data adalah suatu object Intent):
/*ambil hasilnya menggunakan 'getData()'*/
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();

No comments: