這一節介紹一下activity之間參數傳遞。我們知道用intent可以實現activity之間相互跳轉,在跳轉的同時我們不免也需要傳遞一些參數,下面就介紹一下如何在一個activity裡傳遞參數,在另一個activity裡接受參數。
activity之間有兩種參數傳遞形式:一種是一個activity啟動另一個activity的時候傳遞資料到另一個activity,然後在activity中接受到資料,做相應處理。另一種是一個activity啟動另個一activity傳遞資料,當另個一activity視窗關閉後,在傳遞資料到啟動它的那個activity。
我們先看一下第一種方式
首先先建立一個ActivityDemo項目:
public class MainDemoActivity extends Activity { private Button button1,button2; @Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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 stubIntent 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; @Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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 stubString 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; @Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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並得到了連絡人的名字。