安卓活动间的传值问题

一、向下一个活动传递数据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>
activity_main.xml

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

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

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

经过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();
            }
        });
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()时直接调用就好。

相关文章
相关标签/搜索