Android---intent和startActivityForResult方法的使用---页面跳转和数据回传
Android页面跳转和数据回传
今天我尝试用两个页面实现数据的传递和回传,出现了一些问题,把问题已经成功的案例总结如下:
具体是这样的:
有两个layout布局,两个activity。MainActivity对应的布局里有一个文本框,给文本框添加点击事件,当点击文本框时,会跳转到MoreActivity中并显示另一个布局界面,
另一个布局界面里若干条数据(使用了checkBox)用户自由选择之后,点击确定按钮,可以跳转回到MainActivity对应的界面。同时这个界面里面的文本框内容就是用
户自己选择的文本内容。
刚开始我想使用bundle实现传值,如果使用这种方式,把这一部分代码写在onCreate()里面,那么只要打开主页面方法就会被调用,可此时bundle并没有接收到来自另
一个页面传来的值,所以就会抛出异常(NullPointerException)这说明把跳转和数据接收写在同一个位置是不可行的,那么就需要把页面跳转和接收回传的数据这两个
功能分开写。
如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,
新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。
注意:startActivityForResult这个方法里会有requestCode参数,这个参数是要告诉即将跳转到的界面,跳转前的界面的“名字代号”就是requestCode,那么相应地,在跳转
到的界面如果要返回,返回的时候同样会带上一个resultCode,这个是确定这是从哪个界面跳回去的,如果只有两个页面,那这些码也就不重要了,如果要实现复杂的页
面跳转功能,就必须使用这两个参数来确定跳转唯一性。
这是系统定义的参数码的常量值:
请求码作用举例:如果A页面有两个按钮,分别实现的是不同的功能,但是点击这两个按钮都会跳转到B页面,B页面处理之后也会跳回A页面,但是B页面处理地是不同的
按钮,这时候就需要A页面的两个按钮在发出请求的时候就给两个请求带上不同的requestCode,那么B页面处理完之后也要回传不同的resultCode这样两个不同的按钮和两
组不同的数据就不会再发生冲突,在A页面重写onActivityResult(int requestCode, int resultCode, Intent data)方法,步骤是这样的,首先确定requestCode使用if...else语句或
者switch...case语句,然后再区分不同的resultCode,最后再接收回传的数据结果。
好了,现在上代码:
activity_main.xml
1 <EditText
2 android:id="@+id/tv_text5"
3 android:layout_width="300dp"
4 android:layout_height="154dp"
5 android:layout_above="@+id/tv_button1"
6 android:layout_alignParentEnd="true"
7 android:layout_alignParentRight="true"
8 android:layout_marginEnd="11dp"
9 android:layout_marginRight="11dp"
10 android:layout_marginBottom="6dp"
11 android:hint="点击跳转填写"
12 android:onClick="onClick"
13 android:textColor="@android:color/holo_purple" />
activity_more.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical"
6 >
7
8 <TextView
9 android:id="@+id/tvHead"
10 android:layout_width="wrap_content"
11 android:layout_height="wrap_content"
12 android:layout_centerHorizontal="true"
13 android:text="特殊情况"
14 android:layout_gravity="center"
15 android:textColor="@color/red"
16 android:background="@color/colorPrimary"
17 android:textSize="30dp" />
18 <TextView
19 android:layout_width="wrap_content"
20 android:layout_height="wrap_content"
21 android:textColor="@color/coral"
22 android:text="多选:"
23 android:textSize="23dp"
24 android:layout_marginLeft="40dp"
25 />
26 <CheckBox
27 android:id="@+id/cb_0"
28 android:layout_width="wrap_content"
29 android:layout_height="wrap_content"
30 android:layout_below="@+id/tvHead"
31 android:layout_marginTop="32dp"
32 android:layout_marginLeft="40dp"
33 android:layout_toLeftOf="@+id/tvHead"
34 android:textSize="20dp"
35 android:text="无" />
36
37 <CheckBox
38 android:id="@+id/cb_1"
39 android:layout_width="wrap_content"
40 android:layout_height="wrap_content"
41 android:layout_alignBaseline="@+id/cb_2"
42 android:layout_alignBottom="@+id/cb_2"
43 android:layout_marginLeft="40dp"
44 android:layout_toRightOf="@+id/cb_2"
45 android:textSize="20dp"
46 android:text="2021年2月1日至今去过或者现在居住在中高风险地区" />
47 <CheckBox
48 android:id="@+id/cb_2"
49 android:layout_width="wrap_content"
50 android:layout_height="wrap_content"
51 android:layout_alignBaseline="@+id/cb_0"
52 android:layout_alignBottom="@+id/cb_0"
53 android:layout_alignLeft="@+id/cb_0"
54 android:layout_marginLeft="40dp"
55 android:textSize="20dp"
56 android:text="本人或家人正在集中隔离" />
57 <CheckBox
58 android:id="@+id/cb_3"
59 android:layout_width="wrap_content"
60 android:layout_height="wrap_content"
61 android:layout_alignBaseline="@+id/cb_0"
62 android:layout_alignBottom="@+id/cb_0"
63 android:layout_alignLeft="@+id/cb_0"
64 android:layout_marginLeft="40dp"
65 android:textSize="20dp"
66 android:text="本人或家人有出现发热症状" />
67 <CheckBox
68 android:id="@+id/cb_4"
69 android:layout_width="wrap_content"
70 android:layout_height="wrap_content"
71 android:layout_alignBaseline="@+id/cb_0"
72 android:layout_alignBottom="@+id/cb_0"
73 android:layout_alignLeft="@+id/cb_0"
74 android:layout_marginLeft="40dp"
75 android:textSize="20dp"
76 android:text="居住地改变" />
77
78 <Button
79 android:id="@+id/btn_add"
80 android:layout_width="66dp"
81 android:layout_height="38dp"
82 android:layout_below="@+id/cbSing"
83 android:layout_centerHorizontal="true"
84 android:layout_marginLeft="260dp"
85 android:layout_marginTop="36dp"
86 android:onClick="onClick"
87 android:text="确定"
88 android:textSize="10dp" />
89 </LinearLayout>
MainActivity.java
1 private TextView text5;
2 text5=findViewById(R.id.tv_text5);
3 //点击跳转事件
4 public void onClick(View view) {
5 if (view.getId() == R.id.tv_text5) {
6 Intent intent = new Intent(this, MoreActivity.class);
7 intent.putExtra("flag",RESQUEST);
8 startActivityForResult(intent,RESQUEST);
9 }
10 }
11
12 //接收复选框传过来的数据
13 @Override
14 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
15 super.onActivityResult(requestCode, resultCode, data);
16 switch (resultCode)
17 {
18 case RESULT_OK:
19 tempstr=data.getExtras().getString("mess");
20 Log.v("输出“特殊情况”获取结果 ",data.getExtras().getString("mess"));
21 text5.setText(tempstr);
22 break;
23 default:
24 break;
25 }
26 }
MoreActivity.java
1 package com.example.helloworld;
2
3 import android.content.Intent;
4 import android.os.Bundle;
5 import android.util.Log;
6 import android.view.View;
7 import android.widget.Button;
8 import android.widget.CheckBox;
9 import android.widget.CompoundButton;
10 import android.widget.EditText;
11 import android.widget.TextView;
12
13 import androidx.annotation.Nullable;
14 import androidx.appcompat.app.AppCompatActivity;
15
16 public class MoreActivity extends AppCompatActivity implements View.OnClickListener {
17 private CheckBox cb_0;
18 private CheckBox cb_1;
19 private CheckBox cb_2;
20 private CheckBox cb_3;
21 private CheckBox cb_4;
22 String str1="";
23 String str2="";
24 String str3="";
25 String str4="";
26 String str0="";
27 String str="";
28
29 @Override
30 protected void onCreate(@Nullable Bundle savedInstanceState) {
31 super.onCreate(savedInstanceState);
32 setContentView(R.layout.activity_more);
33 //初始化多选功能的按钮
34 initMore();
35 //设置监听器
36 setListener();
37 //设置监听器
38 // 初始化控件对象
39 Button btn_add = findViewById(R.id.btn_add);
40 // 绑定点击监听器
41 btn_add.setOnClickListener(this);
42 }
43
44 public void onClick(View view) {
45 if (view.getId() == R.id.btn_add) {
46 Intent intent = new Intent();
47 intent.putExtra("mess",str);
48 Log.v("MoreActivity得到的结果: ",str);
49 setResult(RESULT_OK,intent);
50 this.finish();
51 }
52 }
53 CompoundButton.OnCheckedChangeListener myCheckChangelistener = new CompoundButton.OnCheckedChangeListener() {
54 @Override
55 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
56 // TODO Auto-generated method stub
57 //设置TextView的内容显示CheckBox的选择结果
58 setText();
59 }
60 };
61 //把多选框选中的东西放到主界面的text5上面,
62 // 并且把选中的记录放到数据库。
63 private void setText()
64 {
65
66 if(cb_0.isChecked())
67 {
68 str0 = cb_0.getText().toString();
69 cb_1.setChecked(false);
70 cb_2.setChecked(false);
71 cb_3.setChecked(false);
72 cb_4.setChecked(false);
73 // Log.v("cb_0: ",str0);
74 }
75 else{
76 str0="";
77 }
78 if(cb_0.isChecked()==false)
79 {
80 if(cb_1.isChecked())
81 {
82 str1= cb_1.getText().toString();
83 // Log.v("cb_1: ",str1);
84 }
85 else{
86 str1="";
87 }
88 if(cb_2.isChecked())
89 {
90 str2 = cb_2.getText().toString();
91 // Log.v("cb_2: ",str2);
92 }
93 else{
94 str2="";
95 }
96 if(cb_3.isChecked())
97 {
98 str3 = cb_3.getText().toString();
99 // Log.v("cb_3: ",str3);
100 }
101 else{
102 str3="";
103 }
104 if(cb_4.isChecked())
105 {
106 str4 = cb_4.getText().toString();
107 // Log.v("cb_4: ",str4);
108 }
109 else{
110 str4="";
111 }
112 }
113 str=str0+" "+str1+" "+str2+" "+str3+" "+str4;
114 Log.v("choicesResult: ",str);
115 }
116 private void initMore(){
117 cb_0=findViewById(R.id.cb_0);
118 cb_1=findViewById(R.id.cb_1);
119 cb_2=findViewById(R.id.cb_2);
120 cb_3=findViewById(R.id.cb_3);
121 cb_4=findViewById(R.id.cb_4);
122 }
123 //
124 //给多选框设置监听器
125
126 private void setListener(){
127 cb_0.setOnCheckedChangeListener(myCheckChangelistener);
128 cb_1.setOnCheckedChangeListener(myCheckChangelistener);
129 cb_2.setOnCheckedChangeListener(myCheckChangelistener);
130 cb_3.setOnCheckedChangeListener(myCheckChangelistener);
131 cb_4.setOnCheckedChangeListener(myCheckChangelistener);
132 }
133 }
在这一部分代码里,我出现了一个小问题,就是在跳转的时候会有一个finish()函数的调用,如果调用不当就会出现闪退的情况。
finish()
用于结束一个Activity的生命周期
问题是这样的:假如从A跳转到B,那么A里面是不可以写这个方法的,因为一个页面不可以既跳转,又结束自身声明周期。B页面里需要回跳的时候要写这个方法。
不使用finish():从activity 1中启动activity 2,然后在activity 2 启动activity 3, 这时按下返回键 程序就返回到了activity 2,再按下返回键 就返回到activity 1;
使用finish():从activity 1中启动activity 2,在activity 2调用finish(),然后在activity 2 启动activity 3,这时按下返回键 程序就直接返回了activity 1
注意:
如果在startActivityForResult起来的Activity里面设置setResult,
结果并不会马上返回给parent的Activity,只有当前Activity被finish,
结果才会被发送给parent的onActivityResult去处理!
那么也就是说,被跳转的页面必须写finish()方法,数据才可以完成回传。
activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功:
onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的。
Tomorrow the birds will sing.
Android---intent和startActivityForResult方法的使用---页面跳转和数据回传的更多相关文章
- android Intent的startActivityForResult()方法
startActivityForResult() 之前学习了利用Intent跳转页面的同时传值,但有的时候需要从跳转到的页面返回所需要的值(如修改了用户信息,需要返回修改的信息),通俗的意思就是A.A ...
- android 页面跳转,数据回传
package com.example.firstpg.firstpg; import android.support.v7.app.ActionBarActivity; import android ...
- Android first --- 页面跳转及数据传递
页面跳转即数据传递 创建第二个界面Acivity *需要在清单文件中添加配置一个Actuvity标签 标签中如果带有这个子节点,则会在Android中添加一个快捷图标 <intent-filte ...
- Flutter页面跳转返回数据
Dart中的异步请求和等待和ES6中的方法很像,直接使用async...await就可以实现. 核心代码: _navigateToAddress(BuildContext context) async ...
- 从零开始学android开发-详细谈谈intent的startActivityForResult()方法
1.两种实现activity跳转的方法 实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();例如activity A跳转到act ...
- intent的startActivityForResult()方法
/******************************************************************************************** * au ...
- Android:通过startActivityForResult方法来得到Activity的回传值
在一些情况下,我们通过 A activity跳转到 B activity上,这时希望 A activtiy能从 B activity上得到一些返回值,这个时候我们就不能使用startActivity方 ...
- Android Studio 之 通过 Intent 完成点击按钮实现页面跳转
•Intent 简介 Intent 是 Android 程序中各组件之间进行交互的一种重要方式: 它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据. Intent 有多个构造函数,其 ...
- Android应用开发基础之六:页面跳转和数据传递
创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> <action ...
- Android初级教程理论知识(第五章页面跳转和数据传递)
总体概述: Android四大组件 Activity BroadCastReceiver Service ContentProvider 创建第二个activity 新创建的activity,必须在清 ...
随机推荐
- Spring Security实现JDBC用户登录认证
在搭建博客后端服务框架时,我采用邮件注册+Spring Security登录认证方式,结合mysql数据库,给大家展示下具体是怎么整合的. 本篇是基于上一篇:spring boot实现邮箱验证码注册 ...
- Java Socket设置timeout几种常用方式总结
原文链接:https://my.oschina.net/shipley/blog/715196 最近碰到读取第三方提供socket接口需要设置超时时间问题,特此记录一下.原文中有几处拼写错误顺便改掉了 ...
- JVM之直接内存与非直接内存
直接内存 直接内存:概指系统内存,而非堆内存,不指定大小时它的大小默认与堆的最大值-Xmx参数值一致. 非直接内存: 也可以称之为堆内存,运行JVM都会预先分配一定内存,我们把JVM管理的这些内存称为 ...
- Redis原理再学习01:数据结构-跳跃表skiplist
跳跃表skiplist 简介 你一定比较好奇Redis里面的 sorted set 是怎么实现的,底层到底是什么?它的排序功能就是用到了这个skiplist-跳跃表. 什么是跳跃表? 跳跃表可以看做是 ...
- Generating equals/hashCode implementation but without a call to superclass
Generating equals/hashCode implementation but without a call to superclass1.lombok 警告,没有注入父类的字段当我们给一 ...
- Qt+QtWebApp开发笔记(六):http服务器html实现静态相对路径调用第三方js文件
前言 前面做了一些交互,网页是直接通过html对response进行返回的,这里QtWebApp与传统的web服务器不同,传统的web服务器可以调用同级目录相对路径或者绝对路径下的js,而QtWe ...
- 公司服务器建站笔记(三):腾讯云服务器CentOS8.2安装界面环境,使用vnc远程登陆并搭建轻量级Qt服务器
前言 有些小项目可能只有几个点,几十个点,几百个点,这个时候使用qt的tcp服务器或者mqtt或者websocket等相关服务就可以满足,腾讯云CentOs8.2服务器安装的是没有界面的版本,本篇 ...
- stat模块
# stat模块定义了常数和函数,并用这些来解释os.stat().os.fstat()和os.lstat()的结果(如果这些在该平台上存在的话). stat.S_ISREG(mode) # 判断mo ...
- select_for_update悲观锁
例子,银行存款和撤销方法 1.用户A提取帐户 - 余额为100 $. 2.用户B提取帐户 - 余额为100 $. 3.用户B退出30 $ - 余额更新为100 $ - 30 $ = 70 $. 4.用 ...
- linux服务器文件实时同步
linux服务器文件实时同步 1 背景说明 在做系统集群部署时,涉及到两个或多个服务器之间文件同步.在软件层面linux服务环境找到以下两种同步方式 利用linux NFS功能将网络共享文件挂载成本地 ...