首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

不同Activity其间的数据传递

2012-09-28 
不同Activity之间的数据传递不同Activity之间的数据传递Bundle对象的实现范例说明在上一个范例里,介绍了如

不同Activity之间的数据传递
             不同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对象的使用在此仅供参考,详细的应用以及属性方法,将会在未来讨论控件时,再详细解说。

package irdc.ex03_10;   /* import相关class */ import android.app.Activity;  import android.content.Intent;  import android.os.Bundle;  import android.view.View;  import android.widget.Button;  import android.widget.EditText;  import android.widget.RadioButton;   public class EX03_10 extends Activity   {    /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState)     {      super.onCreate(savedInstanceState);      /* 载入main.xml Layout */     setContentView(R.layout.main);            /* 以findViewById()取得Button对象,并添加onClickListener */     Button b1 = (Button) findViewById(R.id.button1);      b1.setOnClickListener(new Button.OnClickListener()      {        public void onClick(View v)        {          /*取得输入的身高*/         EditText et = (EditText) findViewById(R.id.height);          double height=Double.parseDouble(et.getText().toString());          /*取得选择的性别*/         String sex="";          RadioButton rb1 = (RadioButton) findViewById(R.id.sex1);          if(rb1.isChecked())          {            sex="M";          }          else         {            sex="F";          }          /*new一个Intent对象,并指定class*/         Intent intent = new Intent();          intent.setClass(EX03_10.this,EX03_10_1.class);                    /*new一个Bundle对象,并将要传递的数据传入*/         Bundle bundle = new Bundle();          bundle.putDouble("height",height);          bundle.putString("sex",sex);                  /*将Bundle对象assign给Intent*/         intent.putExtras(bundle);                  /*调用Activity EX03_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对象传递过来的性别与身高,经过计算之后,显示在屏幕上。

package irdc.ex03_10;   /* import相关class */ import java.text.DecimalFormat;  import java.text.NumberFormat;  import android.app.Activity;  import android.os.Bundle;  import android.widget.TextView;   public class EX03_10_1 extends Activity   {    /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState)    {      super.onCreate(savedInstanceState);      /* 加载main.xml Layout */     setContentView(R.layout.myalyout);            /* 取得Intent中的Bundle对象 */     Bundle bunde = this.getIntent().getExtras();            /* 取得Bundle对象中的数据 */     String sex = bunde.getString("sex");      double height = bunde.getDouble("height");            /* 判断性别 */     String sexText="";      if(sex.equals("M"))      {        sexText="男性";      }      else     {        sexText="女性";      }            /* 取得标准体重 */     String weight=this.getWeight(sex, height);            /* 设置输出文字 */     TextView tv1=(TextView) findViewById(R.id.text1);      tv1.setText("你是一位"+sexText+"\n你的身高是"                 +height+"厘米\n你的标准体重是"+weight+"公斤");    }        /* 四舍五入的method */   private String format(double num)    {      NumberFormat formatter = new DecimalFormat("0.00");      String s=formatter.format(num);      return s;    }     /* 以findViewById()取得Button对象,并添加onClickListener */      private String getWeight(String sex,double height)    {      String weight="";      if(sex.equals("M"))      {        weight=format((height-80)*0.7);      }      else     {        weight=format((height-70)*0.6);      }        return weight;    }  }
res/layout/mylayout.xml

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

<?xml version="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的声明,否则系统将无法运行,请看以下的描述。

<?xml version="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>          <action android:name="android.intent.action.MAIN" />          <category android:name="android.intent.category.LAUNCHER" />        </intent-filter>      </activity>      <activity android: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> 等封装的方式可供使用

参考。
来源:http://hi.baidu.com/lfcaolibin/blog/item/1e29f7546d7328cfb745aef5.html

热点排行