ارسال داده بین activity های مختلف با استفاده از شی Intent
بسم الله الرحمن الرحیم
ارسال داده بین activity های مختلف با استفاده از شی Intent
فصل دوم-بخش نهم
در کنار دریافت داده از یک Activity, ارسال داده به یک Activity دیگر هم بسیار رایج می باشد.به عنوان مثال شما می خواهید در EditText یک متن پیش فرض قبل از به نمایش در آمدرن Activityقرار گیرید. که برای این کار شما می توایند از شی intent استفاده کنید. در مثال های زیر انواع روش های ارسال داده ها به activity دیگر به شما شرح می دهیم
پروژه جدیدی را به نام PassingData ایجاد کنید
دستورات به فایل main.xml اضافه کنید
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_SecondActivity"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Click to go to Second Activity" />
</LinearLayout>
- یک فایل Xml جدید در res\layout با نام secondactivity.xml ایجاد کنید
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Welcome to Second Activity" />
<Button
android:id="@+id/btn_MainActivity"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Click to return to main activity"
android:onClick="onClick"/>
</LinearLayout>
دستورات زیر را در فایل SecondActivity.java اضافه کنید
package com.MehrdadJavidi.passingdata;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class SecondActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
Button btn =(Button)findViewById(R.id.btn_MainActivity);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/** TODO Auto-generated method stub*/
Intent i = new Intent();
/**---use the putExtra() method to return some*/
/** value---*/
i.putExtra("age3", 45);
i.setData(Uri.parse("in matn aza Activity Dovom daryaf kardim"));
setResult(RESULT_OK,i);
finish();
}
});
Toast.makeText(this,getIntent().getStringExtra("str1"),
Toast.LENGTH_SHORT).show();
Toast.makeText(this,Integer.toString(
getIntent().getIntExtra("age1", 0)),
Toast.LENGTH_SHORT).show();
Bundle bundle = getIntent().getExtras();
Toast.makeText(this, bundle.getString("str2"),
Toast.LENGTH_SHORT).show();
Toast.makeText(this,Integer.toString(bundle.getInt("age2")),
Toast.LENGTH_SHORT).show();
}
}
آنهای که با Bold مشخص کرده ایم را در فایلAndroidManifest.xml وارد کنید
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.MehrdadJavidi.passingdata"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.MehrdadJavidi.passingdata.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.MehrdadJavidi.passingdata.SecondActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="com.MehrdadJavidi.passingdata.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
دستورات زیر را در فایل MainActivity.java وارد نمایید.
package com.MehrdadJavidi.passingdata;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn =(Button)findViewById(R.id.btn_SecondActivity);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/** TODO Auto-generated method stub*/
Intent i = new
Intent("com.MehrdadJavidi.passingdata.SecondActivity");
/**---use putExtra() to add new name/value pairs---*/
i.putExtra("str1", "Matn Aval Az MainActivity");
i.putExtra("age1", 25);
/**---use a Bundle object to add new name/values
/** pairs---*/
Bundle extras = new Bundle();
extras.putString("str2", "Matn Dovom Az MainActivity ");
extras.putInt("age2", 35);
/**---attach the Bundle object to the Intent object---*/
i.putExtras(extras);
/**---start the activity to get a result back---*/
startActivityForResult(i, 1);
}
});
}
public void onActivityResult(int requestCode,
int resultCode, Intent data)
{
/**---check if the request code is 1---*/
if (requestCode == 1) {
/**---if the result is OK---*/
if (resultCode == RESULT_OK) {
/**---get the result using getIntExtra()---*/
Toast.makeText(this, Integer.toString(
data.getIntExtra("age3", 0)),
Toast.LENGTH_SHORT).show();
/**---get the result using getData()---*/
Toast.makeText(this, data.getData().toString(),
Toast.LENGTH_SHORT).show();
}
}
}
}
حال برنامه با زدن کلید F11 اجرا کنید.
توضیحات
در اینجا بعضی از راها ی ارسال داده بین activity ها را شرح می دهیم.
اولین روش استفاد از متد putExtra() مر بوط به شی Intent که به وسیله آن نام و مقادیر (name/value) را اضافه می کنیم
i.putExtra("str1", "Matn Aval Az MainActivity");
در اینجا ما دومقدار را همراه با نام و مقادیرشان وارد کرده ایم. نوع اول از نوع string که نام آن str1 و که مقدار آن Matn Aval Az MainActivity و دیگر از نوع intger می باشد که نام آن age1 و مقدا آن 25 می باشد.
درکنار متدputExtra() , شما می توانید یک شی Bundle ایجاد کنید. و از متد putExtras() استفاده کنید. این طور فکر کنید که شی Bundle یک دیکشنری می باشد. که شامل نام و مقادیر(name/value) می باشد که آن را می توانیم به به عنوام پارامتر متد putExtra() شی intent ارسال کنیم.
Bundle extras = new Bundle();
extras.putString("str2", "Matn Dovom Az MainActivity ");
extras.putInt("age2", 35);
/**---attach the Bundle object to the Intent object---*/
i.putExtras(extras);
در activity دوم که داده های ارسالی را دریافت می کند از شی intent استفاده می کنیم.شما باید ابتدا شی intent را دریافت کنید که این کار را با getIntent() انجام میدهیم. و سپس با متد getStringExtra() که نام(name) را دریافت و مقدار(value) آن را بر می گرداند . مقادیر مورد نظر را باز یابی می کنیم.
Toast.makeText(this,getIntent().getStringExtra("str1"),
Toast.LENGTH_SHORT).show();
در این مورد شما getStringExtra() نوع داده String را باز یابی کرده اید. برای باز یابی مقادیر integr شما باید getIntExtra() استفاده می کنید. که پارامتر دوم مقدار پیش فرض می باشد در صورتی که مقداری برای آن تعیین نشده باشد استفاده می شود.
Toast.makeText(this,Integer.toString(
getIntent().getIntExtra("age1", 0)),
Toast.LENGTH_SHORT).show();
برای باز یابی با شی Bundle شما از متد getExtras() استفاده می کنیم.
برای باز یابی مقادیر به صورت خاص شما باید از متد مناسب استفاد ه کنید به عنوان مثال برای یاز یابی مقادیر از نوع string از متد getString() استفاده می کنیم.
Toast.makeText(this, bundle.getString("str2"),
Toast.LENGTH_SHORT).show();
و متد getInt() برای باز یابی نوع داده intger استفاده می کنیم.
Toast.makeText(this,Integer.toString(bundle.getInt("age2")),
Toast.LENGTH_SHORT).show();
و یک راه دیگر برای بازیابی داده همان که در بخش قبلی بیان کرده ایم استفاده از متد setData() میباشد
/**---use the setData() method to return some value---*/
i.setData(Uri.parse("in matn aza Activity Dovom daryaf kardim"));
برای باز یابی داده های که توسط setData تعیین شده شما از متد getData() استفاده میکنیم که آن را در بخش قبلب بیان کردیم . مانند زیر
/**---get the result using getData()---*/
Toast.makeText(this, data.getData().toString(),
Toast.LENGTH_SHORT).show();