之前 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. 关于Floyd-Warshall算法由前趋矩阵计算出的最短路径反映出了算法的执行过程特性的证明

    引言:Floyd-Warshall算法作为经典的动态规划算法,能够在O(n3)复杂度之内计算出所有点对之间的最短路径,且由于其常数较小,对于中等规模数据运行效率依然可观.算法共使用n此迭代,n为顶点个 ...

  2. mysql 挑选列导入

    insert into boleht_development.`htprojects`(id,pname,`general`,imgsrc,whatwedo,howwedo,bp) select ci ...

  3. MVC地址输出变为小写

    其实个人不知道有什么区别,看到大多数都是小写,还是小写吧 去nuget安装一个第三方,然后对路由简单修改一下 插件名称:LowercaseRoutesMVC 方法名:MapRouteLowercase ...

  4. preview放大镜

    [preview放大镜] preview有放大镜功能,放`键即可(键盘左上角,1左边的键).

  5. SaltStack 运行机理特点

    SaltStack 运行机理特点 1.实时通讯(REAL-TIME COMMUNICATION) 所有 Salt minions 接收命令都是同时的,这意味着控制 10 个或者 10000 个系统所消 ...

  6. 使用Cloudrea Manager在CDH集群中添加kafka服务节点,更改borker.id配置后无法启动

    需要保证meta.properties文件中的broker.id和cloudrea manager的web页面上kafka配置的broker.id一致,最好让server.properties中的br ...

  7. system存储说明和制作os模板时的注意事项

    1.通过ISO制作模板时,安装机器后,使用非持久化磁盘安装后,无法从硬盘引导:使用持久化磁盘可以.2.system 存储,当opennebula 初次部署时,会生成0(system),1(image) ...

  8. spring4-2-bean配置-3-自动装配

  9. STM32 FATFS文件系统移植

    http://www.360doc.com/content/11/1221/10/7736891_173820469.shtml

  10. [SoapUI] 通过Groovy调用批处理文件.bat

    import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def proje ...