這一節介紹一下activity之間參數傳遞。我們知道用intent可以實現activity之間相互跳轉,在跳轉的同時我們不免也需要傳遞一些參數,下面就介紹一下如何在一個activity裡傳遞參數,在另一個activity裡接受參數。
activity之間有兩種參數傳遞形式:一種是一個activity啟動另一個activity的時候傳遞資料到另一個activity,然後在activity中接受到資料,做相應處理。另一種是一個activity啟動另個一activity傳遞資料,當另個一activity視窗關閉後,在傳遞資料到啟動它的那個activity。
我們先看一下第一種方式
首先先建立一個ActivityDemo項目:
public class MainDemoActivity extends Activity {
private Button button1,button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1=(Button) this.findViewById(R.id.button1);
button2=(Button) this.findViewById(R.id.button2);
button1.setOnClickListener(new MyListener());
button2.setOnClickListener(new MyListener());
}
private class MyListener implements View.OnClickListener{
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent();
if(v==button1){
intent.setClass(MainDemoActivity.this, FirstDemoActivity.class);
}else if(v==button2){
intent.setClass(MainDemoActivity.this, ResultDemoActivity.class);
}
startActivity(intent);
}
}
}
接著給出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/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="傳遞參數不得到傳回值" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="傳遞參數得到傳回值" />
</LinearLayout>
看一下第一種是怎麼傳遞參數的:
public class FirstDemoActivity extends Activity {
private Button button3;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.first);
button3=(Button) this.findViewById(R.id.button3);
editText=(EditText) this.findViewById(R.id.editText1);
button3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
String content=editText.getText().toString();
Intent intent=new Intent(FirstDemoActivity.this,SecondDemoActivity.class);
//可以把要傳遞的參數放到一個bundle裡傳遞過去,bundle可以看做一個特殊的map.
Bundle bundle=new Bundle();
bundle.putString("result", "第一個activity的內容");
bundle.putString("content",content);
intent.putExtras(bundle);
//也可以用這種方式傳遞.
//intent.putExtra("result", "第一個activity的內容");
startActivity(intent);
}
});
}
}
看一下在SecondDemoActivity中怎麼接受參數:
public class SecondDemoActivity extends Activity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
textView=(TextView) this.findViewById(R.id.textView3);
Intent intent=getIntent();
String result=intent.getStringExtra("result");
String content=intent.getStringExtra("content");
textView.setText(result+" : "+content);
}
}
啟動,看一下運行效果:
點擊發送按鈕:
OK! 成功。
接下來看看第二種方式:
先看一下頁面的布局檔案:
<?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:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
核心代碼:
public class ResultDemoActivity extends Activity {
/** Called when the activity is first created. */
private TextView text;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
text=(TextView)this.findViewById(R.id.text);
pickContact();
}
private void pickContact(){
Intent intent=new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
//在這裡也可以傳遞一些參數
//intent.putExtra(name, value)
//第二個參數就是onActivityResult 裡得第一個參數。
startActivityForResult(intent,1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if(resultCode==Activity.RESULT_OK && requestCode==1){
Cursor cusor=this.getContentResolver()
.query(data.getData(), new String[]{ContactsContract.Contacts.DISPLAY_NAME},
null, null, null);
if(cusor.moveToFirst()){
String str=cusor.getString(cusor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
text.setText(str);
}
}
}
}
代碼我想大家都看的懂吧!不懂得看我以前的使用Content Provider得到連絡人資訊這一節
看一下運行效果:
這是我通訊錄的連絡人。點擊listview:
返回到了ResultDemoActivity並得到了連絡人的名字
摘自 wangkuifeng0118的專欄