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();
}
});
}
}
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的用法(表示这个地方自学的比较模糊,我尽可能的写出我的见解)
网上关于这方面的文章有不少,但大多都是一个模板,我看到优快云博主 尼古拉斯_赵四 写的非常详细,但是我还是没看懂。。。。。
首先,我要说的是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.youkuaiyun.com/jiangwei0910410003/article/details/16983049
========================分割线==============================
Activity数据的传输折腾了一天才搞明白,但是请求码那块还是不太明白,等待上课老师讲到的时候仔细听听,下课问问吧。。
终于写完了,好累啊 = =