文档章节

Activity经典实例二:启动其他Activity并返回结果

Xushao
 Xushao
发布于 2012/09/06 10:02
字数 1111
阅读 3969
收藏 7

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

概述:

如果启动另一个Activity,并且希望返回结果给当前的Activity,那么可使用startActivityForResult()方法,在这种情况下,也是通过Bundle来进行数据交换的。

为了获取到被启动的Activity,当前的Activity要重写onActivityResult(int requestCode, int resultCode, Intent intent)方法,其中参数1代表请求码,参数2代表返回的结果码,由开发者根据业务需要自定义。

一个Activity中可能包含多个按钮,并调用多个startActivityForResult()方法来打开多个不同的Activity处理不同的业务。当这些新的Activity关闭后,系统都会回调前面那个Activity的onActivityResult()方法。为了知道该方法是由哪个请求的结果所触发的,可利用requestCode请求码;为了知道返回的数据来自于哪个新的Activity,可利用resultCode结果码。

 

一、项目实例:

在第二个Activity里让用户选择所在地,并将选择的结果返回给第一个Activity

完整代码:

ForResultActivity.java

package com.xsjayz.ac;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class ForResultActivity extends Activity {

	private Button button;
	private EditText cityEdit;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		button = (Button) findViewById(R.id.btn);
		cityEdit = (EditText) findViewById(R.id.city_edit);

		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(ForResultActivity.this,
						SecondActivity.class);
				// 启动对应的Activity,并等待返回的结果,其中0为请求码(requestCode),用于标识该请求。
				startActivityForResult(intent, 0);
			}
		});
	}

	/**
	 * 重写onActivityResult()方法:以回调的方式来获取指定Activity返回的结果。
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode,
			Intent intent) {
		// 当requestCode和resultCode都为0时(处理特定的结果)。
		if (requestCode == 0 && resultCode == 0) {
			
			Bundle bundleData = intent.getExtras();
			String resultCity = bundleData.getString("city");
			cityEdit.setText(resultCity);
		}
	}

}

SecondActivity.java

package com.xsjayz.ac;

import android.app.ExpandableListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class SecondActivity extends ExpandableListActivity {

	private String[] provinces = new String[] { "上海", "江西", "浙江" };
	private String[][] cities = new String[][] { { "徐汇", "黄浦", "浦东" },
			{ "上饶", "萍乡", "南昌" }, { "嘉兴", "绍兴", "杭州" } };

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		/**
		 * ExpandableListAdapter
		 */
		ExpandableListAdapter adapter = new BaseExpandableListAdapter() {
			@Override
			public boolean isChildSelectable(int groupPosition, int childPosition) {
				return true;
			}

			@Override
			public boolean hasStableIds() {
				return true;
			}

			// 该方法决定每个组选项的外观
			@Override
			public View getGroupView(int groupPosition, boolean isExpanded,
					View convertView, ViewGroup parent) {

				LinearLayout linearLayout = new LinearLayout(SecondActivity.this);
				linearLayout.setOrientation(0);
				ImageView logo = new ImageView(SecondActivity.this);
				linearLayout.addView(logo);
				TextView textView = getTextView();
				textView.setText(getGroup(groupPosition).toString());
				linearLayout.addView(textView);

				return linearLayout;
			}

			@Override
			public long getGroupId(int groupPosition) {
				return groupPosition;
			}

			@Override
			public int getGroupCount() {
				return provinces.length;
			}

			// 获取指定组位置处的组数据
			@Override
			public Object getGroup(int groupPosition) {
				return provinces[groupPosition];
			}

			@Override
			public int getChildrenCount(int groupPosition) {
				return cities[groupPosition].length;
			}

			// 该方法决定每个子选项的外观
			@Override
			public View getChildView(int groupPosition, int childPosition,
					boolean isLastChild, View convertView, ViewGroup parent) {

				TextView textView = getTextView();
				textView.setText(getChild(groupPosition, childPosition).toString());

				return textView;
			}

			@Override
			public long getChildId(int groupPosition, int childPosition) {
				return childPosition;
			}

			// 获取指定组位置、指定子列表项处的子列表项数据
			@Override
			public Object getChild(int groupPosition, int childPosition) {

				return cities[groupPosition][childPosition];
			}

			private TextView getTextView() {

				AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
						ViewGroup.LayoutParams.FILL_PARENT, 64);
				TextView textView = new TextView(SecondActivity.this);
				textView.setLayoutParams(lp);
				textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
				textView.setPadding(60, 0, 0, 0);
				textView.setTextSize(20);

				return textView;
			}
		};

		// 设置该窗口显示列表
		setListAdapter(adapter);
		getExpandableListView().setOnChildClickListener(
				new OnChildClickListener() {
					@Override
					public boolean onChildClick(ExpandableListView parent,
							View v, int groupPosition, int childPosition, long id) {
						// 获取启动该Activity的上一个Activity对应的Intent
						Intent intent = getIntent();
						Bundle data = new Bundle();
						data.putString("city", cities[groupPosition][childPosition]);
						intent.putExtras(data);
						// 设置SecondActivity的结果码(resultCode),并设置在当前结束后退回去的Activity
						setResult(0, intent);
						finish();
						return false;
					}
				});
	}
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/set_city_btn" />

    <EditText
        android:id="@+id/city_edit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:editable="false"
        android:hint="@string/city_edit" />

</LinearLayout>

 

二、问题

今天在写这段代码的时候,遇到一个纳闷的问题:

1、从A跳转到B

// 从AActivity跳转到BActivity,并传递参数过去
Intent intent = new Intent(AActivity.this,BActivity.class);
intent.putExtra("path", filterImgPath);
startActivityForResult(intent,REQUEST_CODE_GETIMAGE_FILTER);

2、在B处接收从A传递的数据,没有问题

getIntent().getStringExtra("path");

3、在B处理完成后,返回到A的过程,触发A的onActivityResult()方法

// 完成
doneButton.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = getIntent();

		// 情形1
		// Bundle bundle = new Bundle();
		// bundle.putString("filterPath", mNewPath);

		// 情形2
		intent.putExtra("filterPath", mNewPath);

		ImageFilterActivity.this.setResult(RESULT_OK, intent);
		ImageFilterActivity.this.finish();
	}
});

4、在A处的onActivityResult()里

else if (requestCode == REQUEST_CODE_GETIMAGE_FILTER) {

	// 情形1,获得的bundle 不为null,但是newPath为null
	// Bundle bundle = data.getExtras();
	// String newPath = bundle.getString("filterPath");

	// 情形2,newPath不为null
	String newPath = data.getStringExtra("filterPath");
}

5、问题应该处在3,即3里面采用new一个Bundle对象来传递数据,这个Bundle应该没有和Intent对象关联,导致的结果就是在4里获得的Bundle对象不是3里的Bundle对象。

 

© 著作权归作者所有

Xushao
粉丝 88
博文 78
码字总数 54484
作品 0
杭州
程序员
私信 提问
Android:四种启动模式分析

在一个项目中会包括着多个Activity,系统中使用任务栈来存储创建的Activity实例,任务栈是一种“后进先出”的栈结构。举个栗子,若我们多次启动同一个Activity。系统会创建多个实例依次放入任...

丁佳辉
01/30
20
0
你真的了解Activity的启动模式吗?

引言 当面试官说请你介绍一下activity启动模式,大多数人都能整两句,什么栈顶复用啊栈内复用啊,不过,你确定你真的懂启动模式吗? 如果你能回答出下面的问题,那么你可以直接退出当前界面。...

吴七禁
2018/07/05
0
0
Activity 与 Fragment 之间相互通信

欢迎转载,但请保留文章原始出处→→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4000390.html 联系方式:smyhvae@163.com 【正文】 一、接口回...

iSnowFlake
2015/11/19
3.9K
1
activity 的属性android:taskAffinity和android:allowTask

1.清单文件中,activity 的属性 android:allowTaskReparenting 这个属性用于设定Activity能够从启动它的任务中转移到另一个与启动它的任务有亲缘关系的任务中,转移时机是在这个有亲缘关系的...

leesama
2014/11/07
114
0
android Activity启动模式

Activity的启动模式有两种:一种是在AndroidManifest.xml文件中,配置launchMode属性,还有一种是设置intent的flag的方式来启动 1、设置android:launchMode属性 可以分为四种:standard、sin...

西米小娅
2018/09/18
50
0

没有更多内容

加载失败,请刷新页面

加载更多

跑分44W的荣耀V30 5G手机,真香!

     昨天看了红米K30的发布会,感触颇多啊,“卢本伟”就是雷军请来恶心荣耀的吧,恶心的还淋漓尽致,发布会全程diss荣耀V30,结果跑分出来的那一刻,网友们笑了。红米K30 26W+的跑分充...

梅丽莎好
13分钟前
5
0
技术分享 | 巧用 binlog Event 发现问题

作者:高鹏(八怪) 文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。 有了前面对 Event 的了解,我们就可以利用这些 Event 来完成一些...

爱可生
14分钟前
5
0
php之微信公众号发送模板消息

讲一下开发项目中微信公众号发送模板消息的实现过程(我用的还是Thinkphp5.0)。先看一下效果,如图: 就是类似于这样的,下面讲一下实现过程: 第一步:微信公众号申请模板消息权限: 立即申请...

owenzhang24
20分钟前
4
0
Dev 日志 | 如何将 jar 包发布到 Maven 中央仓库

摘要 Maven 中央仓库并不支持直接上传 jar 包,因此需要将 jar 包发布到一些指定的第三方 Maven 仓库,比如:Sonatype OSSRH 仓库,然后该仓库再将 jar 包同步到 Maven ,本文详细记录整个发...

NebulaGraph
31分钟前
4
0
海思3516cv500 SDK开发环境搭建

环境Ubuntu 16.0.4 LTS, SDK文件:Hi3516CV500_SDK_V2.0.1.0.tgz,解压此文件到当前目录运行Hi3516CV500_SDK_V2.0.1.0目录下的sdk.unpack,执行此脚本时报unknown source,但sdk.unpack脚本里...

仪山湖
33分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部