首页 > 系统 > Android > 正文

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

2019-11-07 23:38:36
字体:
来源:转载
供稿:网友

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”)设置想要传递的数值,再使用intent.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数据的传输折腾了一天才搞明白,但是请求码那块还是不太明白,等待上课老师讲到的时候仔细听听,下课问问吧。。

终于写完了,好累啊 = =


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表