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.javapackage 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.javapackage 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数据的传输折腾了一天才搞明白,但是请求码那块还是不太明白,等待上课老师讲到的时候仔细听听,下课问问吧。。
终于写完了,好累啊 = =
新闻热点
疑难解答