一只大二狗的Android历程--Activity之间的简单数据传递

2017年2月25日 1:51 PM

今天周六,没有课,也不用去机房办公室值班,于是乎早起在宿舍打了会儿 守望,然后就开始继续学习Android,

今天学习的是Activity间的简单数据交互,

为什么叫简单数据交互呢,因为用Intent传递数据的话只能传递些简单的数据类型如 int,double,float,char ,String.....像复杂点的数据数组什么的就有点麻烦了

使用Intent传递数据有两种方式,

一个是使用intent.putExtra("参数1",“参数2”) intent.getStringExtra("参数1"),其中 参数1代表是传递的变量名,参数2是传递的数据

另一个是先声明一个bundle,然后使用用Bundle.putExtra("参数1",“参数2”) Bundle.getString("参数1")intent.putExtras(bundle),其中参数1是传递的变量名

两个都差不多,都是先收集数据,然后通过startActivity(intent)方法传递数据,唯一的区别 bundle是把需要传递的数据整合在一起,然后通过intent.putExtras(bundle)一块传递到目标activity里intent.getStringExtra("参数1")

第一种的原理是在 A.class里首先建立一个Intent ,然后使用intent.putExtra("参数1",“参数2”)设置自己想要传递的数值,再使用startActivity(intent)传递参数据,在B.java里新建变量使用intent.getStringExtra("参数1")给新变量赋值

示例代码:

A.java

        intent.putExtra("v1","....");
        intent.putExtra("v2","....");
        startActivity(intent);
B.java

        Intent intent =getIntent();
        String V1 =intent.getStringExtra("v1");
        String V2 = intent.getStringExtra("v2");

第二种的原理是在A.class里新建Intent,Bundle,然后使用 Bundle.putExtra("参数1",“参数2”) 设置想要传递的数值,再使用i ntent.putExtras(bundle)打包传递,通过 startActivity(intent)传递数据,在B.class里 新建Bundle和新变量 然后使用 intent.getStringExtra("参数1")给新变量赋值,个人觉得这个比较好用,把数据一块打包过去

A.java

            Bundle bundle =new Bundle();
            Intent intent = new Intent(A.this,B.class);
            bundle.putString("v1","....");
            bundle.putString("v2","....");
            intent.putExtras(bundle);
            startActivity(intent);

B.java

        Intent intent =getIntent();
        Bundle bundle=intent.getExtras();
        String V1=bundle.getString("v1");
        String V2=bundle.getString("v2");


下面给大家看个项目示例


项目示例:(这段代码实现的是使用Intent的数据传递完成注册功能,注释处为Bundle用法)

MainActivity.java

import android.app.Activity;
import android.content.Intent;
import android.inputmethodservice.Keyboard;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;
import java.util.Timer;
import java.util.TimerTask;
import static android.R.attr.data;
import static android.R.attr.logo;
import static com.eee.eeeee.R.styleable.View;

public class MainActivity extends AppCompatActivity{
    public EditText et1,et2;
    public RadioButton rb1,rb2;
    public static final int RC=1;
    @Override
   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b1 =(Button)findViewById(R.id.BB1);
        Button b2 =(Button)findViewById(R.id.BB2);
        et1 =(EditText)findViewById(R.id.et_UN);
        et2 =(EditText)findViewById(R.id.et_PW);
        rb1 =(RadioButton)findViewById(R.id.man);
        rb2 =(RadioButton)findViewById(R.id.woman);
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                passData();
                Toast.makeText(MainActivity.this,"Regist Successful!",Toast.LENGTH_SHORT).show();
   }
        });
        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,SecACT.class));
                finish();
            }
        });
    }
        public void passData(){
        /**Intent**/
        Intent intent =new Intent(this,SecACT.class);
        intent.putExtra("un",et1.getText().toString().trim());
        intent.putExtra("pd",et2.getText().toString().trim());
        /**Bundle**/
//        Bundle bundle =new Bundle();
//        bundle.putString("un",et1.getText().toString().trim());
//        bundle.putString("pd",et2.getText().toString().trim());
        String sex="";
        if(rb1.isChecked()){
             sex="Man";
        }else if(rb2.isChecked()){
             sex="Woman";
        }
        /**Intent**/
       intent.putExtra("sex",sex);
       startActivity(intent);
        /**Bundle**/
//        bundle.putString("sex",sex);
//        intent.putExtras(bundle);
 }
    /**Double Click BackButton to Exit**/
    private long firstTime=0;
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        switch (keyCode){
            case KeyEvent.KEYCODE_BACK:
                long secondTime=System.currentTimeMillis();
                if(secondTime-firstTime>2000){
                    Toast.makeText(MainActivity.this,"Press Again to Exit!",Toast.LENGTH_SHORT).show();
                    firstTime=secondTime;
                    return true;
                }else{
                    finish();
                }
                break;
        }
        return super.onKeyUp(keyCode, event);
    }
}

SecAct.java

package com.eee.eeeee;

import android.os.Bundle;
import android.content.Intent;
import android.inputmethodservice.Keyboard;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import static com.eee.eeeee.R.styleable.View;
/**
 * Created by li124 on 2017/2/24.
 */

public class SecACT extends AppCompatActivity {
    public TextView tv1,tv2,tv3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_secact);
        /**Intent**/
        tv1=(TextView)findViewById(R.id.name);
        tv2=(TextView)findViewById(R.id.pass);
        tv3=(TextView)findViewById(R.id.sex);
        Button b1 = (Button) findViewById(R.id.back1);
        Intent intent =getIntent();
        String name =intent.getStringExtra("un");
        String pass = intent.getStringExtra("pd");
        String sex =intent.getStringExtra("sex");
        tv1.setText("Your UserName: "+name);
        tv2.setText("Your PassWord: "+pass+" (Please Do not tell Others)");
        tv3.setText("Your Sex: "+sex);
        /**Bundle**/
//        Bundle bundle=intent.getExtras();
//        String name=bundle.getString("un");
//        String pass=bundle.getString("pd");
//        String sex1=bundle.getString("sex");
//        tv1.setText("Your UserName: "+name);
//        tv2.setText("Your PassWord: "+pass+" (Please Do not tell Others)");
//        tv3.setText("Your Sex: "+sex1);

        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(SecACT.this,MainActivity.class));
                finish();
            }
      });

    }
}


XML布局文件:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:context="com.eee.eeeee.MainActivity"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="500dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:orientation="horizontal"
        android:id="@+id/linearLayout2">
        <TextView
            android:id="@+id/T1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="UserName  "
            android:textSize="25sp"/>
        <EditText
            android:id="@+id/et_UN"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:hint="Plese Input"/>
    </LinearLayout>
    <RadioGroup
        android:id="@+id/RG"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:contentDescription="Sex"
        android:layout_marginTop="100dp"
        android:orientation="horizontal"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Sex"
            android:textSize="23sp"/>
        <RadioButton
            android:id="@+id/man"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_marginLeft="35dp"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Man"
            android:textSize="23sp"/>
        <RadioButton
            android:id="@+id/woman"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_marginLeft="35dp"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Woman"
            android:textSize="23sp"/>
    </RadioGroup>
    <GridLayout
        android:layout_marginTop="15dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:columnCount="2"
        android:layout_below="@+id/RG"
        android:layout_centerHorizontal="true">
        <Button
            android:id="@+id/BB1"
            android:text="Register"/>
        <Button
            android:onClick="OnClick"
            android:id="@+id/BB2"
            android:text="Cancel"
            android:layout_marginLeft="10dp"/>
    </GridLayout>
    <LinearLayout
        android:layout_width="500dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0dp"
        android:layout_marginRight="20dp"
        android:orientation="horizontal"
        android:id="@+id/linearLayout"
        android:layout_below="@+id/linearLayout2"
        android:layout_alignStart="@+id/linearLayout2">
        <TextView
            android:id="@+id/T2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Password   "
            android:textSize="25sp"/>
        <EditText
            android:id="@+id/et_PW"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:hint="Plese Input"
            android:inputType="textPassword"/>
    </LinearLayout>
</RelativeLayout>

activity_secact.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:id="@+id/name"
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/pass"
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:layout_marginTop="20dp"
        android:id="@+id/sex"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:layout_marginTop="200dp"
        android:text="BACK"
        android:id="@+id/back1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />
    <TextClock
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textClock"
        android:textSize="30dp"
        android:gravity="center"/>
</LinearLayout>



效果图:





=======================分割线=======================

接下来该说的就是关于数据回传的问题了,在生活中经常会遇到这类的要求,比如我在A activity通过按钮转到B activity,然后在B activity里选择了某项图片,按返回按钮返回A activity时,在A activity上显示出刚刚所选的图片

恩。。。。感觉自己说起来挺轻巧的,实现起来却很困难,intent理论上不能干这么复杂的工作,当然也让intent可以通过传递R.id的形式让目标activity抽取相应的资源,好了其实我要说的是Android里的 onActivityResult和setResult的用法(表示这个地方自学的比较模糊,我尽可能的写出我的见解)

网上关于这方面的文章有不少,但大多都是一个模板,我看到CSDN博主 尼古拉斯_赵四 写的非常详细,但是我还是没看懂。。。。。

首先,我要说的是onActivityResult(int requestCode, int resultCode ,Intent data)这个方法,这个方法一共有三个参数

- requestCode : 请求码 ,用来请求数据的

- resultCode: 结果码,当目标activity使用了finish()方法时,标识是来自哪个activity的数据

- data :传递的数据

一般是以这样的形式写出来的


      @Override                         //这个需要重写方法
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          public static final int RC=1; //这个值一般是>=0的
          if(requestCode==RC){          //判断是否为目标activity的返回值
              switch (resultCode){      //判断是否为finish()方法结束的,而不是用户点击返回键返回的(返回键的话会返回RESULT_CANCEL)
                  case RESULT_OK:
                      String dataString=data.getStringExtra("V1"); //通过Intent获得传递的数据的值,并赋给dataString
              }
          }
      }

还有,切换页面的时候就不能使用 startActivity(intent)了,需要使用的是 startActivityForResult(Intent intent,int requestCode)方法,这里面新增了一个 requestCode参数,这个参数是自定义的,用来识别跳转的activity,说到这里还要解释的就是跳转activity传递数据使用的setResult()方法,这个方法分为两类,一类只传resultCode--->setResult(int resultCode),另一类值和resultCode都传---->setResult(int resultCode,Intent data),

然后演示完整的示例代码:(A.java是初始activity,B.java是跳转界面,通过button实现activity的跳转)

A.java

package com.eee.eeeee;
        import android.app.Activity;
        import android.content.Intent;
        import android.inputmethodservice.Keyboard;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.util.Log;
        import android.view.KeyEvent;
        import android.view.MotionEvent;
        import android.view.View;
        import android.widget.Button;
        import android.widget.EditText;
        import android.widget.RadioButton;
        import android.widget.Toast;
        import java.util.Timer;
        import java.util.TimerTask;
        import static android.R.attr.data;
        import static android.R.attr.logo;
        import static com.eee.eeeee.R.styleable.View;

public class MainActivity extends AppCompatActivity {
    public static final int RC = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b1 = (Button) findViewById(R.id.BB1);
        b1.setOnClickListener(new View.OnClickListener() {  //创建按钮的触发事件
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SecACT.class); //新建Intent设定传送的坐标
                startActivityForResult(intent, RC);                          //开始带参的折越
            }
        });
    }

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) { //设定接收
          if(requestCode==RC){
              switch (resultCode){
                  case RESULT_OK:
                      String dataString=data.getStringExtra("V1");
                      Log.i("----------->", dataString);                    //在Log里打印接收到的值
              }
          }
      }
}

B.java

package com.eee.eeeee;

        import android.os.Bundle;
        import android.content.Intent;
        import android.inputmethodservice.Keyboard;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.util.Log;
        import android.view.KeyEvent;
        import android.view.MotionEvent;
        import android.view.View;
        import android.widget.Button;
        import android.widget.TextView;
        import android.widget.Toast;

        import static com.eee.eeeee.R.styleable.View;
/**
 * Created by li124 on 2017/2/24.
 */

public class SecACT extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_secact);
        Button b1 =(Button)findViewById(R.id.back1) ;
        Intent intent =new Intent();
        intent.putExtra("V1","Hello World");//设定要传的值和变量名
        setResult(RESULT_OK,intent);        //设定resultCode和data(现在处于待机状态,只有接收到finish()时开始传值)
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();                  //通过按钮执行finish()方法,进行传值
            }
        });
}

结果图

在控制台里输出了预期的结果



写到这估计大家有些迷糊吧,给大家看个流程图




看完之后应该明白些了吧,总之这个地方理解不太容易,给大家一个博客的网址,他讲的很好

http://blog.csdn.net/jiangwei0910410003/article/details/16983049


========================分割线==============================

Activity数据的传输折腾了一天才搞明白,但是请求码那块还是不太明白,等待上课老师讲到的时候仔细听听,下课问问吧。。

终于写完了,好累啊 = =



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值