25、Android开发基础之Activity之间数据回传(视频+文章)
2017-12-14 00:22
621 查看
Activity的数据回传
前面我们学习了怎么样把数据传递到下一个Activity,有些时间,数据是需要回传的,比如说,我们去拍照吧。思路:点击一个按钮,然后跳转到拍照的界面,拍完以后,你是不是要显示拍到的内容呢?这个时候,就需要把数据从拍照界面传回来了吧。
或者大家可以想象这样一个使用场景:当你要发微信朋友圈的时候,是不是要选择拍摄或者相册选择呢?拍摄会跳转到拍摄的界面。然后拍完了再回来,回来的时候就已经显示了图片了。
其实这个过程就使用到了这种数据回传的技术了。那我们是不是要学习一下呢?
实现分析
首先,我们还是一样,要打开Activity,先创建意图对象。如果是第三方的那么就用隐式意图,自己的就用显示意图。
但是不同的是,不用startActivity,而是用startActivityForResult这个方法。
好,我们来看一下,这个方法要传什么参数:
第一个参数如大家所愿是intent。
这个方法有两个重载的方法,一个是两个参数,一个是三个参数。
那我们就把三个参数说完吧:
第二个参数是requestCode,翻译过来就是请求码,这个请求码有什么用呢?其实就是暗号!
第三个参数
* @param options Additional options for how the Activity should be started.
这个参数的意思是设置Activity是如何启动的,在ActivityOptions这个类里面,就是封装Activity的启动参数的。这个Bundle可以理解为一个可以封装多种集合即可。
刚吃完饭回来,不知道写啥了,哈哈!!
话不多说,咱们开干吧!
举个栗子
怎么举呢?大概是这样子的:我们从第一个界面,点击重置跳转到第二个界面,然后,充值完成以后,回到第一个界面提示!
怎么样着手呢?还是那样,是界面 的跳转,一样要创建意图对象。
算了,直接看代码吧,里面已经有详细注释了,看完代码,我再把流程图画出来,看看还有什么不懂的,在我们的网站里头支持讨论哦!
交流地址:
bbs.sunofbeaches.com
首先是第一个MainActivity的代码,它就长成这样子:
package com.sunofbeaches.activityforresultdemo; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private static final int sRequestCode = 1; /** * 充值按钮被点击,跳转到充值界面,然后进行充值。 * * @param view */ public void reCharge(View view) { Intent intent = new Intent(this, PayActivity.class); //如果要传输则在这之间封装,比如说有时候需要把用户的id传过去对吧。 //一般来说,这个唯一表示会保存成全应用能访问到的变量(超时了要修改的,不能是常量) startActivityForResult(intent, sRequestCode); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //在这里会返回充值界面返回的数据。 if (requestCode == sRequestCode) { TextView resultText = (TextView) findViewById(R.id.result_text); //说明是我们请求的数据结果,对得上请求码 //然后判断结果码,在支付界面 ,我们定义了-1为失败,1为成功。所以就有了: if (resultCode == -1) { //支付失败,可以是网络问题,也可以是取消充值 resultText.setText("充值失败!如果遇到问题请联系客服!"); } else if (requestCode == 1) { //充值成功,给出提示吧! resultText.setText("感谢您的支持!您已充值 :" + data.getStringExtra("charge") + "\n 您当前的余额是***"); } } } }
这个是MainActivity的UI代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="reCharge" android:text="充值"/> <TextView android:id="@+id/result_text" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
还有就是第二个Activity的代码啦,这个是支付界面 ,也就是PayActivity,要记得在Manifest里头注册一下哦。
package com.sunofbeaches.activityforresultdemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import java.util.regex.Pattern; /** * Create by TrillGates 2017/12/6 */ public class PayActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pay); } /** * 确定充值被点击了,这里提示充值成功,并且把充值的金额返回给前一个界面。 * * @param view */ public void confirmCharge(View view) { EditText chargeInput = this.findViewById(R.id.charge_input); //这里要对数字进行检查,对吧! String targetChargeText = chargeInput.getText().toString().trim(); String reg = "/(^[1-9]([0-9]+)?(\\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\\.[0-9]([0-9])?$)/"; if (TextUtils.isEmpty(targetChargeText)) { //没有输入内容 Toast.makeText(this, "您没有输入充值金额!", Toast.LENGTH_SHORT).show(); } else { //如果有输入,判断是否符合金额的格式 boolean matches = Pattern.matches(reg, targetChargeText); if (matches) { //TODO:向网络提交数据,然后充值 //等待返回结果再更新UI //这里合法的话,那我们就给出提示,并且把数据设置回去即可 //把结果封装到Intent里 Intent resultIntent = new Intent(); resultIntent.putExtra("charge", targetChargeText); setResult(1); finish(); } else { Toast.makeText(this, "您输入的金额不合法,请重新输入!", Toast.LENGTH_SHORT).show(); } } } /** * 取消充值 * * @param view */ public void cancelCharge(View view) { //这个是取消充值 setResult(-1); finish(); } }
把它的布局也弄上来看一下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/charge_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入充值金额" android:inputType="number"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="confirmCharge" android:text="确认充值"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="cancelCharge" android:text="取消充值"/> </LinearLayout>
这些都上完了,我们看一下这个逻辑是怎么样的:
首先,我们点击充值按钮,跳转到充值界面。
点击充值,则会检查输入内容,给出响应的动作,提示输入不合法,或者充值成功,返回结果到第一个界面。
点击取消充值,则会结束当前界面,并且返回结果给第一个界面。
代码流程:
跳转到这个界面:
点击确认充值,其实这样的检测是有问题的,这正则表达式得处理一下。因为我们已经限定的输入为数字了,也就是说小数点是没法输入的:
点击取消充值:
然后,我们都看到了setResult的内容:
这个调用以后,就会回 调到:
这就是整个过程啦!
要注意的事
第一,要注意过程,不是用startActivity,而是用startActivityForResult第二,要复写onActivityResult方法,这里会有返回值
第三,第一个Activity不可finished,否则就接收不到结果了。
在视频中,我们会讲解一个例子,就是调用拍照的例子。我们写一个按钮和一个展示图片的ImageView控件,点击按钮以后,跳转到系统的拍照界面,拍完照片回来以后,获取到返回值,并且显示出来。
大家可以看看这个例子:
http://blog.sunofbeaches.com/archives/64
感谢大家的学习,接下来我们会学习新的内容。
视频会在这周日发出来!敬请期待哦!
欢迎大家加入我们的社区网站:阳光沙滩bbs.sunofbeaches.com
视频下载地址:
链接:https://pan.baidu.com/s/1chQ2Qy 密码:d9ze
相关文章推荐
- 24、Android开发基础之组件之间的数据传输(视频+文章)
- 【Android 开发】 : Activity之间传递数据的几种方式
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- Android基础 -- Activity之间传递数据(bitmap和map对象)
- Android 开发中各Activity之间数据共享
- android 开发之activity之间传递数据
- Android开发笔记---不同activity之间的数据传递
- 【Android基础】利用Intent在Activity之间传递数据
- Android基础 -- Activity之间传递数据(bitmap和map对象)
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android零基础开发001】Activity启动与多个Activity之间的切换
- Android开发 --- 多个Activity,及之间数据传递 Intent
- Android开发之Activity之间数据通信的几种方式
- Android基础 -- Activity之间传递数据(bitmap和map对象)
- Android开发——不同Activity之间的切换和数据传输
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- android 开发之activity之间传递数据
- Android 开发之activity之间传递数据