分类:C#、Android、VS2015;

创建日期:2016-02-23

一、简介

在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activity之间在例子中是相互独立的,两个界面并没有什么关联。但是,很多情况下,在当前Activity中启动另一个Activity,都是为了让用户在被启动的这个Activity中去输入或者选择某些特定的信息,然后将结果返回给当前的Activity。

那么,如何返回这些特定的信息呢?这一节就来解决这个问题。

二、基本设计思路

按照Activity启动的先后顺序,可将先启动的Activity称为界面1,后启动的Activity称为界面2。

要将界面2中的信息返回给界面1,可按下面的步骤来设计。

1、在界面1中启动界面2

在界面1中调用StartActivityForResult()方法启动界面2。例如:

int Activity1RequestCode=1;  //唯一标识子Activity的请求码
Intent intent=new Intent(this,typeof(Activity1));
StartActivityForResult(intent, Activity1RequestCode);
int Activity2RequestCode =2;
var uri= Android.Net.Uri.Parse("content://contacts/people");
Intent intent=new Intent(Intent.ActionPick,uri);
StartActivityForResult(intent, Activity2RequestCode);

2、在界面2中设置返回值

在界面2调用Finish方法关闭它自身之前,调用SetResult方法将所需的数据返回给界面1。SetResult方法有两个参数:结果码和返回值。

结果码表示子Activity返回的状态,通常为Activity.ResultOK和Activity.ResultCanceled。也可以是自定义的结果码。所有结果码都是整数类型。

返回值封装在Intent中,界面2通过Intent将返回的数据传递给界面1。数据主要以Uri的形式来表示,另外还可以通过Extra的集合附加一些额外信息。

例如:

var data = Android.Net.Uri.Parse("tel:" + telNumber);
Intent intent = new Intent(null, data);
var result = intent.PutExtra("address", "XX市XX街12号");
SetResult(Result.Ok, result);
Finish();

3、在界面1中获取返回值

当界面2关闭时,它会自动回调界面1的OnActivityResult方法,因此,只需要在界面1中重写该方法即可得到返回值。例如:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
……
}

在这段代码中,requestCode表示是哪个Activity返回的值,resultCode表示Activity的返回状态,data表示Activity返回的数据(Intent类型)。返回的数据用途不同,Uri中使用的协议也不同。另外,还可以通过Extra方法返回一些原始类型的数据。

三、示例—IntentDemo2

本示例演示如何在当前Activity中获取另一个Activity的返回值。

例子实现两个功能,第1个按钮演示如何读取另一个界面中输入的信息,为简单起见,例子中仅给出了输入电话号码的文本框,而且还没添加提示信息,地址则直接赋值了;第2个按钮演示如何读取另一个界面通过通讯录拨出的电话号码,为了在程序中启动读取通讯录数据的Intent,需要先在模拟器的通讯录中添加联系人(联系人为空就没法测试返回的结果是否正确了),事先添加的通讯录如下:

添加通讯录后,就可以运行示例程序了。

1、示例运行截图

 

 

2、主要设计步骤

(1)ch1202_Main.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/btn1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="获取输入的电话和地址" />
<Button
android:id="@+id/btn2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="获取拨出的电话号码" />
<TextView
android:text="返回的结果:"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textViewResult"
android:layout_margin="30dp" />
</LinearLayout>

(2)ch1202_Layout1.axml

?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:id="@+id/telNumber"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="13811112222"
android:background="@android:color/white"
android:textColor="@android:color/black"
android:layout_margin="20dp"
android:height="40dp" />
<Button
android:id="@+id/btnOK"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="确定" />
<Button
android:id="@+id/btnCancel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="取消" />
</LinearLayout>

(3)ch1202Activity1.cs

using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget; namespace MyDemos.SrcDemos
{
[Activity(Label = "【例12-2】Intent基本用法2")]
public class ch1202Activity1 : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch1202_Layout1); var telNumber = FindViewById<EditText>(Resource.Id.telNumber);
Button btnOK = FindViewById<Button>(Resource.Id.btnOK);
btnOK.Click += delegate
{
var data = Android.Net.Uri.Parse("tel:" + telNumber);
Intent intent = new Intent(null, data);
var result = intent.PutExtra("info",
$"电话:{telNumber.Text},地址:城东区XX楼XX号");
SetResult(Result.Ok, result);
Finish();
}; Button btnCancel = FindViewById<Button>(Resource.Id.btnCancel);
btnCancel.Click += delegate
{
SetResult(Result.Canceled, null);
Finish();
};
}
}
}

(4)ch1202Main.cs

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Widget; namespace MyDemos.SrcDemos
{
[Activity(Label = "【例12-2】Intent基本用法2")]
public class ch1202Main : Activity
{
private enum RequestCode { Activity1RequestCode, Activity2RequestCode } protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch1202_Main); Button btn1 = FindViewById<Button>(Resource.Id.btn1);
btn1.Click += delegate
{
Intent intent = new Intent(this, typeof(ch1202Activity1));
StartActivityForResult(intent, (int)RequestCode.Activity1RequestCode);
}; Button btn2 = FindViewById<Button>(Resource.Id.btn2);
btn2.Click += delegate
{
var uri = Android.Net.Uri.Parse("content://contacts/people");
Intent intent = new Intent(Intent.ActionPick, uri);
StartActivityForResult(intent, (int)RequestCode.Activity2RequestCode);
};
} protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
var result = FindViewById<TextView>(Resource.Id.textViewResult);
switch (requestCode)
{
case (int)RequestCode.Activity1RequestCode:
if (resultCode == Result.Ok)
{
result.Text = "Activity1的返回结果:\n"+ data.GetStringExtra("info");
}
else
{
result.Text = "Activity1的返回结果:null";
}
break;
case (int)RequestCode.Activity2RequestCode:
result.Text = "Activity2的返回结果:\n" + data.DataString; ;
break;
}
}
}
}

运行。

【Android】12.3 在当前Activity中获取另一个Activity的返回值的更多相关文章

  1. android开发之在activity中控制另一个activity的UI更新

    转自:http://blog.csdn.net/jason0539/article/details/18075293 第一种方法: 遇到一个问题,需要在一个activity中控制另一个acitivit ...

  2. 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler

    来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...

  3. 【Android开发-8】生命周期,Activity中打开另外一个Activity

    前言:生命中有很多人陪伴自己走过一生中的某段旅程,仅仅是有些人仅仅是某阶段出现,有些人却陪伴自己非常久.就像小学.中学.高中.大学,那些以前以为会长久拥有的,当经历过天涯各地地忙碌于生活,或如意.或失 ...

  4. 在一个Activity中启动另一个Activity

    一.新建一个空的工程 二.添加一个Activity并命名为BAty 三.在activity_main.xml中添加一个按钮,设置id号为btnStartB <Button android:lay ...

  5. Android开发中在一个Activity中关闭另一个Activity

    比如有ActivityA, ActivityB,在ActivityB中关闭ActivityA 解决方案: 1. 在 ActivityA 里面设置一个静态的变量instance,初始化为this在 Ac ...

  6. Android在一个Activity中关闭另一个Activity

    比如有ActivityA, ActivityB,在ActivityB中关闭ActivityA. 解决方案: 1.在 ActivityA 里面设置一个静态的变量instance,初始化为this,在 A ...

  7. 利用jquery的$.Deferred方法在一个函数内获取另一个函数的返回值

    使用场景:方法B需要方法A执行完成之后再执行,比如方法B中有用到方法A的变量:(需要引入jQuery1.5以后的版本) function A(){ var deffered = new $.Defer ...

  8. 关于Activity的getReferrer():如何在Activity中获取调用者?

    http://blog.csdn.net/u013553529/article/details/53856800 关于Activity的getReferrer()之一:如何在Activity中获取调用 ...

  9. 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

    1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

随机推荐

  1. shapefile文件的符号化问题

    我们都知道,ArcGIS的shp文件只以坐标形式保存地图数据,地图的显示方法则是存储都数据库或地图文件(mxd)中,这一点是深信不疑的. 如果我们打开ArcMap,新建一个普通的地图文件(使用标准的模 ...

  2. 机器学习Python实现 SVD 分解

    这篇文章主要是结合机器学习实战将推荐算法和SVD进行对应的结合 不论什么一个矩阵都能够分解为SVD的形式 事实上SVD意义就是利用特征空间的转换进行数据的映射,后面将专门介绍SVD的基础概念.先给出p ...

  3. Java 类型, Hibernate 映射类型及 SQL 类型之间的相应关系

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  4. java多线程解决应用挂死的问题

    这两天为了定位JBOSS老是挂死的问题,学习了一下JAVA多线程方面的知识,在此总结一下 1.在Java程序中,JVM负责线程的调度.线程调度是指按照特定的机制为多个线程分配CPU的使用权. 调度的模 ...

  5. 解决win10 64位系统可用2.99g

    msconfig-->引导-->高级选项-->最大内存勾去掉

  6. Ubuntu12.04+OpenERP7.0安装笔记

    不经意的一次看到OpenERP这个开源ERP,就被其丰富的功能,简洁的画面,熟悉的语言所吸引.迫不及待的多方查询资料,自己架设一个测试环境来进行了解.以下为测试安装时候的步骤说明,以备查询,并供有需要 ...

  7. servlet实现文件上传,预览,下载和删除

      一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数 ...

  8. KnockoutJS + My97DatePicker

    如何将Knockoutjs和其他脚本库结合使用?这里给出一个Knockoutjs与my97datepicker配合使用的例子,例子中使用了ko的自定义绑定功能: ko.bindingHandlers. ...

  9. 激活web容器对静态资源的默认servlet处理

    在某些servlet的url匹配模式使用/时会拦截一些静态的资源的请求导致无法正确访问,可以采取web容器默认的servlet来处理,当然那些mvc一般也都提供了处理的方法,用何种方式可以自行决定,这 ...

  10. hdu1690Bus System--解题报告

    题意:有一个公交系统的收费标准例如以下表: 然后问:给出 这些L1~4 & C1~4的值,然后 N个站.列出每一个站的X坐标.然后询问M次,问两个站台的最小花费 题解:那么这里非常明显是最短路 ...