不同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里。
运行结果
(点击查看大图)图3-10 在两个Activity间做数据的传递 |
- src/irdc.ex03_10/EX03_10.java
在第一个Activity1主程序中,定义了"性别"选项的RadioGroup以及输入身高的"EditText",并运用Intent及Bundle对象,在调用Activity2(EX03_10_1)时,同时将数据传入。关于EditText对象的使用在此仅供参考,详细的应用以及属性方法,将会在未来讨论控件时,再详细解说。
- packageirdc.ex03_10;
- /*import相关class*/
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.RadioButton;
- publicclassEX03_10extendsActivity
- {
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- /*载入main.xmlLayout*/
- setContentView(R.layout.main);
- /*以findViewById()取得Button对象,并添加onClickListener*/
- Buttonb1=(Button)findViewById(R.id.button1);
- b1.setOnClickListener(newButton.OnClickListener()
- {
- publicvoidonClick(Viewv)
- {
- /*取得输入的身高*/
- EditTextet=(EditText)findViewById(R.id.height);
- doubleheight=Double.parseDouble(et.getText().toString());
- /*取得选择的性别*/
- Stringsex="";
- RadioButtonrb1=(RadioButton)findViewById(R.id.sex1);
- if(rb1.isChecked())
- {
- sex="M";
- }
- else
- {
- sex="F";
- }
- /*new一个Intent对象,并指定class*/
- Intentintent=newIntent();
- intent.setClass(EX03_10.this,EX03_10_1.class);
- /*new一个Bundle对象,并将要传递的数据传入*/
- Bundlebundle=newBundle();
- bundle.putDouble("height",height);
- bundle.putString("sex",sex);
- /*将Bundle对象assign给Intent*/
- intent.putExtras(bundle);
- /*调用ActivityEX03_10_1*/
- startActivity(intent);
- }
- });
- }
- }
src/irdc.ex03_10/EX03_10_1.java
那么,在Activity2(EX03_10_1)要如何接收来自Activity1(EX03_10)传递来的数据呢?试想,在Activity1是以Bundle封装对象,自然在Activity2亦是以Bundle的方式解开封装的数据;程序中以getIntent().getExtras() 方法取得随着Bundle对象传递过来的性别与身高,经过计算之后,显示在屏幕上。
- packageirdc.ex03_10;
- /*import相关class*/
- importjava.text.DecimalFormat;
- importjava.text.NumberFormat;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.widget.TextView;
- publicclassEX03_10_1extendsActivity
- {
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- /*加载main.xmlLayout*/
- setContentView(R.layout.myalyout);
- /*取得Intent中的Bundle对象*/
- Bundlebunde=this.getIntent().getExtras();
- /*取得Bundle对象中的数据*/
- Stringsex=bunde.getString("sex");
- doubleheight=bunde.getDouble("height");
- /*判断性别*/
- StringsexText="";
- if(sex.equals("M"))
- {
- sexText="男性";
- }
- else
- {
- sexText="女性";
- }
- /*取得标准体重*/
- Stringweight=this.getWeight(sex,height);
- /*设置输出文字*/
- TextViewtv1=(TextView)findViewById(R.id.text1);
- tv1.setText("你是一位"+sexText+"/n你的身高是"
- +height+"厘米/n你的标准体重是"+weight+"公斤");
- }
- /*四舍五入的method*/
- privateStringformat(doublenum)
- {
- NumberFormatformatter=newDecimalFormat("0.00");
- Strings=formatter.format(num);
- returns;
- }
- /*以findViewById()取得Button对象,并添加onClickListener*/
- privateStringgetWeight(Stringsex,doubleheight)
- {
- Stringweight="";
- if(sex.equals("M"))
- {
- weight=format((height-80)*0.7);
- }
- else
- {
- weight=format((height-70)*0.6);
- }
- returnweight;
- }
- }
res/layout/mylayout.xml
mylayout.xml为(EX03_10_1)的Layout,定义了显示计算结果的TextView。
- <?xmlversion="1.0"encoding="utf-8"?>
- <AbsoluteLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <TextView
- android:id="@+id/text1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="20sp"
- android:layout_x="50px"
- android:layout_y="72px"
- >
- </TextView>
- </AbsoluteLayout>
AndroidManifest.xml
由于本范例中有两个Activity,所以文件中必须有两个activity的声明,否则系统将无法运行,请看以下的描述。
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="irdc.ex03_10"
- android:versionCode="1"
- android:versionName="1.0.0">
- <application
- android:icon="@drawable/icon"
- android:label="@string/app_name">
- <activity
- android:name=".EX03_10"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <activityandroid:name="EX03_10_1"></activity>
- </application>
- </manifest>
扩展学习
Bundle对象针对了不同的数据类型提供了许多的方法,例如,此范例中传递String类型的数据,使用的方法为Bundle.putString(stringName,stringValue):
- bundle.putDouble("sex",sex);
而要传递Double类型的数据,使用的方法为Bundle.putDouble(doubleName,doubleValue),如下:
- bundle.putString("height",height);
反之,若要由Bundle对象中取出数据,则使用Bundle.getString(stringName)、Bundle.getDouble(doubleName) 等相对应的方法即可。
除了上述简单的传递类型之外,尚有String[] 与ArrayList<String> 等封装的方式可供使用
参考。