不同Activity之间的数据传递

http://book.51cto.com 2009-07-30 10:06 余志龙等 人民邮电出版社

3.10 不同Activity之间的数据传递

Bundle对象的实现

范例说明

在上一个范例里,介绍了如何在Activity中调用另一个Activity,但若需要在调用另外一个Activity的同时传递数据,那么就需要利用android.os.Bundle对象封装数据的能力,将欲传递的数据或参数,通过Bundle来传递不同Intent之间的数据。

本范例的设计为一个简易表单的范例,在Activity1中收集User输入的数据,在离开Activity1的同时,将User选择的结果传递至下一个Activity2,以一个简单BMI"标准体重计算器"示范如何传递数据到下一个Activity里。

运行结果

不同Activity之间的数据传递
(点击查看大图)图3-10 在两个Activity间做数据的传递
范例程序

  1. src/irdc.ex03_10/EX03_10.java

在第一个Activity1主程序中,定义了"性别"选项的RadioGroup以及输入身高的"EditText",并运用Intent及Bundle对象,在调用Activity2(EX03_10_1)时,同时将数据传入。关于EditText对象的使用在此仅供参考,详细的应用以及属性方法,将会在未来讨论控件时,再详细解说。


  1. packageirdc.ex03_10;
  2. /*import相关class*/
  3. importandroid.app.Activity;
  4. importandroid.content.Intent;
  5. importandroid.os.Bundle;
  6. importandroid.view.View;
  7. importandroid.widget.Button;
  8. importandroid.widget.EditText;
  9. importandroid.widget.RadioButton;
  10. publicclassEX03_10extendsActivity
  11. {
  12. /**Calledwhentheactivityisfirstcreated.*/
  13. @Override
  14. publicvoidonCreate(BundlesavedInstanceState)
  15. {
  16. super.onCreate(savedInstanceState);
  17. /*载入main.xmlLayout*/
  18. setContentView(R.layout.main);
  19. /*以findViewById()取得Button对象,并添加onClickListener*/
  20. Buttonb1=(Button)findViewById(R.id.button1);
  21. b1.setOnClickListener(newButton.OnClickListener()
  22. {
  23. publicvoidonClick(Viewv)
  24. {
  25. /*取得输入的身高*/
  26. EditTextet=(EditText)findViewById(R.id.height);
  27. doubleheight=Double.parseDouble(et.getText().toString());
  28. /*取得选择的性别*/
  29. Stringsex="";
  30. RadioButtonrb1=(RadioButton)findViewById(R.id.sex1);
  31. if(rb1.isChecked())
  32. {
  33. sex="M";
  34. }
  35. else
  36. {
  37. sex="F";
  38. }
  39. /*new一个Intent对象,并指定class*/
  40. Intentintent=newIntent();
  41. intent.setClass(EX03_10.this,EX03_10_1.class);
  42. /*new一个Bundle对象,并将要传递的数据传入*/
  43. Bundlebundle=newBundle();
  44. bundle.putDouble("height",height);
  45. bundle.putString("sex",sex);
  46. /*将Bundle对象assign给Intent*/
  47. intent.putExtras(bundle);
  48. /*调用ActivityEX03_10_1*/
  49. startActivity(intent);
  50. }
  51. });
  52. }
  53. }

src/irdc.ex03_10/EX03_10_1.java

那么,在Activity2(EX03_10_1)要如何接收来自Activity1(EX03_10)传递来的数据呢?试想,在Activity1是以Bundle封装对象,自然在Activity2亦是以Bundle的方式解开封装的数据;程序中以getIntent().getExtras() 方法取得随着Bundle对象传递过来的性别与身高,经过计算之后,显示在屏幕上。


  1. packageirdc.ex03_10;
  2. /*import相关class*/
  3. importjava.text.DecimalFormat;
  4. importjava.text.NumberFormat;
  5. importandroid.app.Activity;
  6. importandroid.os.Bundle;
  7. importandroid.widget.TextView;
  8. publicclassEX03_10_1extendsActivity
  9. {
  10. /**Calledwhentheactivityisfirstcreated.*/
  11. @Override
  12. publicvoidonCreate(BundlesavedInstanceState)
  13. {
  14. super.onCreate(savedInstanceState);
  15. /*加载main.xmlLayout*/
  16. setContentView(R.layout.myalyout);
  17. /*取得Intent中的Bundle对象*/
  18. Bundlebunde=this.getIntent().getExtras();
  19. /*取得Bundle对象中的数据*/
  20. Stringsex=bunde.getString("sex");
  21. doubleheight=bunde.getDouble("height");
  22. /*判断性别*/
  23. StringsexText="";
  24. if(sex.equals("M"))
  25. {
  26. sexText="男性";
  27. }
  28. else
  29. {
  30. sexText="女性";
  31. }
  32. /*取得标准体重*/
  33. Stringweight=this.getWeight(sex,height);
  34. /*设置输出文字*/
  35. TextViewtv1=(TextView)findViewById(R.id.text1);
  36. tv1.setText("你是一位"+sexText+"/n你的身高是"
  37. +height+"厘米/n你的标准体重是"+weight+"公斤");
  38. }
  39. /*四舍五入的method*/
  40. privateStringformat(doublenum)
  41. {
  42. NumberFormatformatter=newDecimalFormat("0.00");
  43. Strings=formatter.format(num);
  44. returns;
  45. }
  46. /*以findViewById()取得Button对象,并添加onClickListener*/
  47. privateStringgetWeight(Stringsex,doubleheight)
  48. {
  49. Stringweight="";
  50. if(sex.equals("M"))
  51. {
  52. weight=format((height-80)*0.7);
  53. }
  54. else
  55. {
  56. weight=format((height-70)*0.6);
  57. }
  58. returnweight;
  59. }
  60. }

res/layout/mylayout.xml

mylayout.xml为(EX03_10_1)的Layout,定义了显示计算结果的TextView。


  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <AbsoluteLayout
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. xmlns:android="http://schemas.android.com/apk/res/android"
  6. >
  7. <TextView
  8. android:id="@+id/text1"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:textSize="20sp"
  12. android:layout_x="50px"
  13. android:layout_y="72px"
  14. >
  15. </TextView>
  16. </AbsoluteLayout>

AndroidManifest.xml

由于本范例中有两个Activity,所以文件中必须有两个activity的声明,否则系统将无法运行,请看以下的描述。


  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifest
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. package="irdc.ex03_10"
  5. android:versionCode="1"
  6. android:versionName="1.0.0">
  7. <application
  8. android:icon="@drawable/icon"
  9. android:label="@string/app_name">
  10. <activity
  11. android:name=".EX03_10"
  12. android:label="@string/app_name">
  13. <intent-filter>
  14. <actionandroid:name="android.intent.action.MAIN"/>
  15. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  16. </intent-filter>
  17. </activity>
  18. <activityandroid:name="EX03_10_1"></activity>
  19. </application>
  20. </manifest>

扩展学习

Bundle对象针对了不同的数据类型提供了许多的方法,例如,此范例中传递String类型的数据,使用的方法为Bundle.putString(stringName,stringValue):


  1. bundle.putDouble("sex",sex);

而要传递Double类型的数据,使用的方法为Bundle.putDouble(doubleName,doubleValue),如下:


  1. bundle.putString("height",height);

反之,若要由Bundle对象中取出数据,则使用Bundle.getString(stringName)、Bundle.getDouble(doubleName) 等相对应的方法即可。

除了上述简单的传递类型之外,尚有String[] 与ArrayList<String> 等封装的方式可供使用

参考。