安卓活动间的传值问题

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>
activity_main.xml

在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>
second.xml

在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);
            }
        });
setOnClickListener()

这里我们用显示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"));
}
onCreat()

通过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();
            }
        });
View Code

这里构建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()

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()

其实,我们可以 单独写一个返回数据的方法,然后在按钮注册点击事件或者onBackPressed()时直接调用就好。

posted @ 2016-05-14 22:02  zwy_net  阅读(468)  评论(0编辑  收藏  举报