一、向下一个活动传递数据java
Intent中提供了一系列的putExtra()方法的重载,能够把咱们想要传的数据暂存在Intent中,启动一个活动后,只需把这些数据在从Intent中,取出来便可。作一个简单的Demo演示一下:android
新建项目MyDataTrans,同时在项目中新建类Second.java和布局second.xml。ide
在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用于获取从上一活动或许的值):this
<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中,spa
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()方法中添加以下代码:code
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上显示出来。xml
二、返回数据给上一个活动blog
方法其实和上面的相似,在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()时直接调用就好。