之前 Android-Intent意图传递数据,的博客讲解了,一个Activity 跳转 到另外一个Activity 可以把数据带过去

Android还提供了一种方式,一个Activity 跳转 到另外一个Activity 可以把数据传递过去,然后还可以把数据返回过来,就需要startActivityForResult

在MyActivity1中执行startActivityForResult(intent, 请求码)

然后在MyActivity1重写onActivityResult方法,用于接收返回的信息

package liudeli.activity.intent.result;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; import java.util.ArrayList;
import java.util.List; import liudeli.activity.R;
import liudeli.activity.intent.MyApplication; public class MyActivity1 extends Activity { private EditText etItemInfo; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my1); etItemInfo = findViewById(R.id.et_item_info);
} public void startMyActivity2(View view) {
// 绑定数据
List<String> list = new ArrayList<>();
for (int i=0; i< 30; i++) {
list.add("我是一个条目 下标是: " + i);
} // 把数据绑定给Application
MyApplication myApplication = (MyApplication) getApplication();
myApplication.list = list; Intent intent = new Intent(this, MyActivity2.class);
startActivityForResult(intent, 500); // 请求码 500
} /**
* 用来接收 startActivityForResult --> Activity ->setResult(200, intent);
* @param requestCode startActivityForResult(intent, 500);
* startActivityForResult(intent, 400);
* startActivityForResult(intent, 300);
* startActivityForResult(intent, 310);
* ......
* 如果没有requestCode请求码,就没法对业务逻辑进行划分处理
* 规范写法是,成对判断: requestCode == 500 && resultCode == 200
*
* @param resultCode setResult(200, intent);
* setResult(210, intent);
* setResult(240, intent);
* setResult(260, intent);
* ......
* 如果没有resultCode结果码,就没法对业务逻辑进行划分处理
* 规范写法是,成对判断: requestCode == 500 && resultCode == 200
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); // 不能用getIntent(),要用data 才能获取到item
String item = data.getStringExtra("item"); /*Toast.makeText(this, "requestCode:" + requestCode +
" ,resultCode:" + resultCode +
" ,item:" + item
, Toast.LENGTH_SHORT).show();*/ new AlertDialog.Builder(MyActivity1.this)
.setMessage("requestCode:" + requestCode +
" ,resultCode:" + resultCode +
" ,item:" + item).setPositiveButton("我知道了", null).show(); etItemInfo.setText(item + ""); if (null != item) {
// 设置光标放在最后
etItemInfo.setSelection(item.length());
} // 实际正规写法应该是这样:
// requestCode和startActivityForResult保持一致
// resultCode和setResult(200) 200 保持一致
// 如果返回了intent 就需要判断 null != data
if (requestCode == 500 && resultCode == 200 && null != data) {
// ... 实际业务逻辑处理
}
}
}

MyActivity1的布局文件 activity_my1.xml

在这布局中,重点讲解了,weight 的使用,和理解

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"> <EditText
android:id="@+id/et_item_info"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="startMyActivity2"
android:text="启动My2"
android:layout_weight="0"
/> <!--
注意:⚠️ android:layout_weight="0" 默认是0,0代表的意思是:我先放入填充显示
Button layout_weight = "0" 先放入填充显示
EditText 设置比重为1,后放入显示,然后再 有多少空间给我填充,我就填充多少 所以说:多使用 比重 和 相对布局,有利于 屏幕的自适配 layout_weight 涉及到优先放入填充显示
--> </LinearLayout> </RelativeLayout>

MyActivity1的布局文件 activity_my1.xml 的布局预览:


MyActivity2返回数据,就需要用到 setResult(200, intent); + finish();

package liudeli.activity.intent.result;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView; import java.util.List; import liudeli.activity.R;
import liudeli.activity.intent.MyApplication; public class MyActivity2 extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my2); // 取出数据
MyApplication myApplication = (MyApplication) getApplication();
List<String> list = myApplication.list; ListView listView = findViewById(R.id.listview); // 只有一个数据,简单的展示列表,就采用ArrayAdapter
final ArrayAdapter arrayAdapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
list);
listView.setAdapter(arrayAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 只返回结果码
// setResult(200); String item = (String) arrayAdapter.getItem(position); Intent intent = new Intent();
intent.putExtra("item", item); // 返回结果码,还返回数据,数据用Intent传输
setResult(200, intent);
// 一定要finish(); 否则不结束当前MyActivity1,无法返回给MyActivity1
finish();
}
});
}
}

MyActivity2的布局文件 activity_my2.xml,主要就是一个ListView用来展示列表数据的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView> </RelativeLayout>

效果:

Android-Activity-startActivityForResult的更多相关文章

  1. Android Activity的加载模式和onActivityResult方法之间的冲突

    前言 今天在调试程序时,发现在某一Activity上点击返回键会调用该Activity的onActivityResult()方法.我一开始用log,后来用断点跟踪调试半天,还是百思不得其解.因为之前其 ...

  2. Android之startActivityForResult的使用

    在Android中startActivityForResult主要作用就是: A-Activity需要在B-Activtiy中执行一些数据操作,而B-Activity又要将,执行操作数据的结果返回给A ...

  3. Android activity的回传数据

    package com.example.myact3; import android.content.Intent; import android.os.Bundle; import android. ...

  4. 【转】Android Activity和Intent机制学习笔记----不错

    原文网址:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html Activity Android中,Activity是所有程序的根 ...

  5. Android Activity和Intent机制学习笔记

    转自 http://www.cnblogs.com/feisky: Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具 ...

  6. 【Android】详解Android Activity

    目录结构: contents structure [+] 创建Activity 如何创建Activity 如何创建快捷图标 如何设置应用程序的名称.图标与Activity的名称.图标不相同 Activ ...

  7. Android Activity启动流程源码全解析(1)

    前言 Activity是Android四大组件的老大,我们对它的生命周期方法调用顺序都烂熟于心了,可是这些生命周期方法到底是怎么调用的呢?在启动它的时候会用到startActivty这个方法,但是这个 ...

  8. Android Activity标签属性

    Android Activity标签属性 Activity 是 Android 系统四大应用组件之一,用户可与 Activity 提供的屏幕进行交互,以执行拨打电话.拍摄照片.发送电子邮件等操作开发者 ...

  9. [转]Android Activity的加载模式和onActivityResult方法之间的冲突

    前言 今天在调试程序时,发现在某一Activity上点击返回键会调用该Activity的onActivityResult()方法.我一开始用log,后来用断点跟踪调试半天,还是百思不得其解.因为之前其 ...

  10. 我的Android进阶之旅------>Android Activity的singleTask加载模式和onActivityResult方法之间的冲突

    今天调试一个bug的时候,情景如下: 一个Activity A,需要用startActivityForResult方法开启Activity B.Activity B的launch mode被设置为si ...

随机推荐

  1. 用C#操作IO端口1-用并口控制发光二极管

    什么是端口? 端口包含了一系列信号线, 通过这个端口CPU可以同其他外部设备交换数据, 比如我们经常见到的Modem,打印机等. 通常情况下, 打开的信号是”1”, 关闭的信号是”0”. 并口在同一时 ...

  2. 11.redis连接

    转自:http://www.runoob.com/redis/redis-tutorial.html Redis 客户端连接 Redis 通过监听一个 TCP 端口或者 Unix socket 的方式 ...

  3. MySQL 复合索引

    一. 1.索引越少越好,在修改数据时,第个索引都要进行更新,降低写速度.2.最窄的字段放在键的左边3.避免file sort排序,临时表和表扫描. 二.复合索引的建立原则: 如果您很可能仅对一个列多次 ...

  4. Nginx在Windows下的使用与配置

    前往官网下载对应的windows版本 官网 下载后进入安装目录,启动命令行窗口,输入: nignx -c conf\nginx.conf 则nginx服务器已经启动. 打开浏览器,在标题栏输入: lo ...

  5. (转) iphone开发资源汇总

    如何用Facebook graphic api上传视频: http://developers.facebook.com/blog/post/532/ Keychain保存数据封装: https://g ...

  6. elasticsearch must和should组合查询

    {"query": { "bool": { "should": [ {"bool": { "must" ...

  7. keepalived之vrrp_script详解

    通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup.当master出现异常后,backup自动切换为master.当backup成为master后,mast ...

  8. Perl 变量:哈希变量

    Perl 哈希变量哈希是 key/value 对的集合.Perl中哈希变量以百分号 (%) 标记开始.访问哈希元素格式:${key}. 1.创建哈希创建哈希可以通过以下两种方式: 1.为每个 key ...

  9. Java 枚举类型设置数据字典

    package org.seckill.enums; /** * 使用枚举表示常量数据字典 * Created by 18401 on 2017/11/25. */ public enum Secki ...

  10. 【祥哥带你玩HoloLens开发】了解如何实现远程主机为HoloLens实时渲染

    今天有一个兄弟在群里讲到他们的项目模型比较大,单用HoloLens运行设备的性能无法满足需要,问道如何将渲染工作交给服务器来做,讲渲染结果传给HoloLens.正好刚刚看官方github的时候发现一个 ...