1、向下一个活动传递数据
Intent中提供了一系列的putExtra()方法的重载,可以把我们想要传的数据暂存在Intent中,启动一个活动后,只需把这些数据在从Intent中,取出来即可。做一个简单的Demo演示一下:
新建项目MyDataTrans,同时在项目中新建类Second.java和布局second.xml。
在activity_main.xml中修改布局(TextView用于获取从上一活动或许的值):
<LinearLayout android:id="@+id/lin1" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Click On"/> </LinearLayout> <LinearLayout android:id="@+id/line2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/lin1" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
在second.xml中修改布局(TextView用于获取从上一活动或许的值):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/btn2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Back"/> </LinearLayout>
在MainActivity.java中添加按钮1的单击事件,跳转到活动2中,
btn1=(Button)findViewById(R.id.btn); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent1=new Intent(MainActivity.this,Second.class); intent1.putExtra("mydata", "你好,我来自界面1。。。。"); startActivity(intent1); } });
这里我们用显示Intent的方式启动Second,并通过putExtra()方法传递一个字符串。其中putExtra()接受两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数就是要传递的值。
接着进入到Second.java中,在这里我们的目的就是要把上一个页面传的值进行取出显示,onCreat()方法中添加如下代码:
protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.second); btn2=(Button)findViewById(R.id.btn2); textView2=(TextView)findViewById(R.id.textView2); //获取上一个活动传出的值 Intent intent=getIntent(); textView2.setText(intent.getStringExtra("mydata")); }
通过getIntent()方法获取用于启动的Second的Intent,然后调用getStringExtra()方法,获取相应的键值,就可以得到传递的数据了。然后把传递的数据在TextView上显示出来。
2、返回数据给上一个活动
方法其实和上面的类似,在MainActivity.java中 依旧是点击Button控件跳转到Second页面,
Intent intent1=new Intent(MainActivity.this,Second.class); startActivityForResult(intent1, 1);
这里我们用startActivityForResult()方法来启动Second,startActivityForResult()方法接受两个参数,第一个参数是Intent,第二个参数是请求码,用于在回调中判断数据的来源。其中,请求码只要是唯一值就可以了。
在Second中给按钮注册点击事件,并添加返回数据的逻辑:
btn2=(Button)findViewById(R.id.btn2); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intentback=new Intent(); intentback.putExtra("data_back", "界面1,你好!!!"); setResult(RESULT_OK, intentback); finish(); } });
这里构建Intent仅仅用于传递数据而已,没有任何指定的意图。紧接着要传递的数据放在intentback中,然后调用setResult()方法,用于向上一个活动返回数据。setResult()方法接受两个参数,第一个参数用于向上一个活动返回处理结果,一般只有RESULT_OK或者RESULT_CANCELED这两个值,第二个参数则是把带有数据的intentback传递回去,然后调用finish()方法来销毁当前活动(必须销毁,否则无法回调)。
由于使用startActivityForResult()方法启动的Second,所以在被销毁之后会回调到上一个活动的onActivityResult()方法,因此需要在MainActivity.java中重新写这个方法来得到返回的数据,如下所示:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); textView1=(TextView)findViewById(R.id.textView1); super.onActivityResult(requestCode, resultCode, data); switch(requestCode){ case 1: if(resultCode==RESULT_OK){ textView1.setText(data.getStringExtra("data_back")+"我来自界面2!!!"); } break; default: } }
onActivityResult()有三个参数,第一个参数requestCode,即我们在启动活动时传入的请求码,第二个参数resultCode,即我们在返回出具时传入的处理结果,第三个参数data即我们带有返回数据的Intent(这里指intentback)。
由于一个活动中有可能调用startActivityForResult()方法去启动很多不同的活动,但是每一个活动返回的数据都会调到onActivityResult()中,所以首先要做的就是根据requestCode,即请求码来检查判断数据源。然后再根据resultCode的值来判断处理结果是否成功。最后有打他来传入返回的数据。
答疑:当用户不是通过按钮的单击事件返回,而通过back键返回时是不是就没法获取想要返回的数据了呢?
这时候只需我们调用一个叫做onBackPressed()的方法来解决这个问题。代码如下:
public void onBackPressed() { Intent intentback=new Intent(); intentback.putExtra("data_back", "界面1,你好!!!"); setResult(RESULT_OK, intentback); finish(); }
其实,我们可以 单独写一个返回数据的方法,然后在按钮注册点击事件或者onBackPressed()时直接调用就好。