zoukankan      html  css  js  c++  java
  • 安卓活动间的传值问题

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

  • 相关阅读:
    void die(const char *msg)
    [C] Re-execute itself from elf file.
    在cnblog中使用syntax方法
    CVE-2016-0822-MTK-drivers/misc/mediatek/connectivity/common/combo/linux/wmt_dev.c#1158
    CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android. Buffer Overflow Vulnerability reported by #plzdonthackme, Soctt.
    Insertion Sort
    [Java] 歐付寶金流串接教學
    [面試題]C符號的優先順序
    [LeetCode]Search a 2D Matrix
    [leetcode] Search a 2D Matrix II
  • 原文地址:https://www.cnblogs.com/wynet/p/5493654.html
Copyright © 2011-2022 走看看