Android基础之——startActivityForResult启动界面并返回数据,上传头像
在android应用的开发过程中,常常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程。在非常多应用程序的模块中,都有“我的”这个模块,在未登录状态下点击当中的某一项,就会弹出登录界面,登录完毕后回到我的界面,会显示一些登录后的数据,这个功能的实现就要用到startActivityForResult.
以下通过一个小demo来说明一下startActivityForResult的使用,以及在实际开发中的一些应用。
demo的效果图例如以下:
主界面布局:
三个button,一个textview
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:id="@+id/btn_a"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:layout_marginTop="20dip"
android:text="启动A界面并返回数据" /> <Button
android:id="@+id/btn_b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:layout_marginTop="20dip"
android:text="启动B界面" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dip"
android:orientation="horizontal" > <Button
android:id="@+id/btn_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录" /> <Button
android:id="@+id/btn_logout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="注销"
/>
</LinearLayout> <TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="30dip"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="20dip" /> </LinearLayout>
主界面java代码
public void onClick(View v) {
		Intent intent ;
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.btn_a:
			intent = new Intent(MainActivity.this, ActivityA.class);
			intent.putExtra("data", "传递给A的数据");
			startActivityForResult(intent, A);
			break;
		case R.id.btn_b:
			intent = new Intent(MainActivity.this, ActivityB.class);
			intent.putExtra("data", "传递给B的数据");
			startActivity(intent);
			break;
		case R.id.btn_login:
			intent = new Intent(MainActivity.this,LoginActivity.class);
			intent.putExtra("data", "传递给登录界面的数据");
			startActivityForResult(intent, LOGIN);
			break;
		case R.id.btn_logout:
			btnLogin.setClickable(true);
			logout.setVisibility(View.GONE);
			btnLogin.setText("登录");
			break;
		default:
			break;
		}
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == RESULT_OK) {
			switch (requestCode) {
			case A:
				Bundle bundle = data.getExtras();
				String back = bundle.getString("back");
				Toast.makeText(getApplicationContext(), "A界面传回来的数据为:::::::"+back, 0).show();
				content.setText("A界面传回来的数据"+back);
				break;
			case LOGIN:
				Bundle loginBundle = data.getExtras();
				String username = loginBundle.getString("username");
				String passwrod = loginBundle.getString("password");
				content.setText("登录界面传回来的数据"+username+":::::::"+passwrod);
				btnLogin.setText("已登录");
				btnLogin.setClickable(false);
				logout.setVisibility(View.VISIBLE);
				Toast.makeText(getApplicationContext(), username+"::::::::"+passwrod, 0).show();
				break;
			default:
				break;
			}
		}
	}
当中基本的地方有两个,一个是在启动activity时,假设要带结果返回,则须要使用startActivityForResult(intent, requestcode)这种方法,该方法两个參数一个是带数据的Intent,还有一个就是请求码,这个请求码是用于给activity识别是哪个activity返回的数据,由于在一个activity中可能会出现多个startActivityForResult,因此返回的时候,activity为了识别是哪个activity返回的数据就要利用requestcode来进行区分。
上面另一个非常重要的方法onActivityResult(int requestCode, int resultCode, Intent data) 该方法在startActivityForResult启动的activity结束后返回数据时调用,当中第二个參数是结果码,结果码为RESULT_OK时,说明activity顺便结束并返回结果。
第一个參数requestcode就是被启动的activity的识别码,在startActivityForResult方法时传入。
第三个參数data 是Intent型的数据,该数据就是从activity返回回来的数据,能够使用data.getExtras()方法得到bundle,然后从bundle中取出一些基本数据。
通过不同的结果码,对不同的activity返回的数据进行对应的操作,就能够合理的完毕一些特定的功能效果。
那么,是不是全部的startActivityForResult启动的activity都回返回数据呢?答案是否定的,要想要activity返回数据,在activity中也要进行响应的一些设置,请看activity的代码
ActivityA的代码例如以下:
protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		LinearLayout ll = new LinearLayout(this);
		LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.WRAP_CONTENT);
		ll.setLayoutParams(params);
		ll.setOrientation(LinearLayout.VERTICAL);
		TextView tv = new TextView(this);
		tv.setText("我是A界面");
		ll.addView(tv);
		Button close = new Button(this);
		close.setText("关闭界面并返回");
		close.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.putExtra("back", "我是A界面返回的数据");
				setResult(RESULT_OK, intent);
				finish();
			}
		});
		ll.addView(close);
		setContentView(ll);
		Toast.makeText(getApplicationContext(),
				getIntent().getExtras().getString("data"), 0).show();
	}
注意当中有一段代码,是setResult(RESULT_OK, intent); 之后紧接着 finish();
activity要能成功返回数据,就必须在结束finish()之前调用setResult方法,该方法的两个參数,第一个为结果码,也就是onActivityResult方法中的第二个參数resultcode,普通情况下我们都设置该值为RESULT_OK
ActivityB因为使用的是startActivity 因此无需返回数据
ActivityB的代码例如以下:
protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activityb);
		Button close = (Button) findViewById(R.id.btn_close);
		close.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				finish();
			}
		});
		Toast.makeText(getApplicationContext(),
				getIntent().getExtras().getString("data"), 0).show();
	}
LoginActivity的代码:
protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login);
		etUsername = (EditText) findViewById(R.id.et_username);
		etPassword = (EditText) findViewById(R.id.et_password);
		Button login = (Button) findViewById(R.id.btn_login);
		login.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String password = etPassword.getText().toString().trim();
				String username = etUsername.getText().toString().trim();
				Toast.makeText(getApplicationContext(), "登录成功,返回原来界面", 0)
						.show();
				Intent intent = new Intent();
				intent.putExtra("username", username);
				intent.putExtra("password", password);
				setResult(RESULT_OK, intent);
				finish();
			}
		});
		Toast.makeText(getApplicationContext(),
				getIntent().getExtras().getString("data"), 0).show();
	}
该界面登录成功后,将username和password返回到主页面,并显示,同一时候主页面不能再次登录,能够使用注销操作。
到这里,这个小demo就完毕了。
主要演示二个功能,一个是启动activity并带结果返回,将结果显示在页面上。
一个是启动activity不带结果返回,这样的操作比較经常使用和简单。
完整的代码:http://download.csdn.net/download/yanglfree/7503139
以下再来说下startActivityForResult还有一个比較经常使用的应用场景:上传头像
效果图例如以下:
点击头像后,弹出选择对话框,选择相冊或者拍照,完毕后会出现裁剪界面,裁剪完毕后,会将头像显示在界面上,假设有server的话,会将头像上传到server。
看下几段关键的代码:
头像的点击事件:
public void onClick(View v) {
				CharSequence[] items = { "查看头像", "手机相冊", "手机拍照" };
				new AlertDialog.Builder(MainActivity.this).setTitle("上传照片")
						.setItems(items, new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog,
									int which) {
								if (which == SELECT_PICTURE) {
									Intent intent = new Intent(
											Intent.ACTION_PICK);
									intent.setType("image/*");
									startActivityForResult(intent,
											PHOTO_REQUEST_GALLERY);
								} else if (which == SELECT_CAMERA) {
									Intent intent = new Intent(
											"android.media.action.IMAGE_CAPTURE");
									// 推断存储卡能否够用,可用进行存储
									if (hasSdcard()) {
										intent.putExtra(
												MediaStore.EXTRA_OUTPUT,
												Uri.fromFile(new File(
														Environment
																.getExternalStorageDirectory(),
														PHOTO_FILE_NAME)));
									}
									startActivityForResult(intent,
											PHOTO_REQUEST_CAMERA);
								} else if (which == SELECT_SCAN) {
									// TODO 查看头像
								}
							}
						}).create().show();
			}
		});
当中,启动相冊和拍照都是採用的startAcitivityForResult方法,而且,因为相冊和拍照都是系统应用,因此,intent使用指定的intent
拍照: "android.media.action.IMAGE_CAPTURE"
相冊:Intent.ACTION_PICK
在activityResult方法中:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == Activity.RESULT_OK) {
			if (requestCode == PHOTO_REQUEST_GALLERY) {// 图库
				if (data == null) {
					return;
				}
				Uri uri = data.getData();
				crop(uri);
			} else if (requestCode == PHOTO_REQUEST_CAMERA) {// 拍照
				if (hasSdcard()) {
					file = new File(Environment.getExternalStorageDirectory(),
							PHOTO_FILE_NAME);
					crop(Uri.fromFile(file));
				} else {
					Toast.makeText(this, "未找到存储卡,无法存储照片!", 0).show();
				}
			} else if (requestCode == PHOTO_REQUEST_CUT) {// 裁剪
				try {
					bmp = data.getParcelableExtra("data");
					photo.setImageBitmap(bmp);
					File tempFile = BitmapUtils.saveBitmapFile(bmp,
							PHOTO_FILE_NAME);
					upload(tempFile);//上传到server
					pd = new ProgressDialog(this);
					pd.setMessage("头像正在上传中请稍后");
					pd.show();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
完整的代码下载:http://download.csdn.net/detail/yanglfree/7504613
Android基础之——startActivityForResult启动界面并返回数据,上传头像的更多相关文章
- Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)
		
Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件第二版 上次粗略的写了相同功能的代码,这次整理修复了之前的一些BUG,结构也大量修改 ...
 - 上传头像,界面无跳转,php+js
		
上传头像,界面无跳转的方式很多,我用的是加个iframe那种.下面直接上代码. html: //route 为后端接口//upload/avatar 为上传的头像的保存地址//imgurl=/uplo ...
 - Android Studio如何配置CURL指令一键打包apk上传至蒲公英
		
Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...
 - Android基础:startActivityForResult 和 onActivityResult 问题
		
项目中用到弹出Acitivity来获得用户输入 所以用到 onActivityResult()方法接受用户输入 奇怪问题 startActivityForResult() 后直接调用 onActivi ...
 - Android基础知识04—Activity活动之间传递数据
		
------活动之间传递数据------ 向下一个活动传递数据: Intent中提供了一系列的putExtra()方法,可以把数据暂存到Intent中,启动另一个活动的时候就可以取出来. 代码: (存 ...
 - 【Android 复习】:从Activity中返回数据
		
在实际的应用中,我们不仅仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递类似,也可以采用上一讲中的四种方式来传递数据,但是一般建议采用Intent对象的方式的来返 ...
 - 让Android中的webview支持页面中的文件上传
		
android webview在默认情况下是不支持网页中的文件上传功能的: 如果在网页中有<input type="file" />,在android webview中 ...
 - Android开发中使用七牛云存储进行图片上传下载
		
Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...
 - SpringMVC入门一:基础知识(依赖、注解、文件上传/下载、拦截器、异常处理等)
		
为了使Spring可插入MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作 ...
 
随机推荐
- 在Sql中使用Try Catch
			
原文:在Sql中使用Try Catch 今天在写sql中出现了!我想在sql使用trycatch吧! 哎..但是语法又记不住了! 那就清楚我们的google大师吧! 嘿,网上关于在sql中使用Try ...
 - 仿微沟道效应,主要actionbar有些知识
			
仿微沟道效应,主要actionbar有些知识 1.新actionBar的menu <menu xmlns:android="http://schemas.android.com/apk ...
 - quick-cocos2d-x游戏开发【5】——创建菜单
			
一个菜单是游戏中的一个基本要素,quick在里面menuItem有两个包.一个是图片菜单.一个文本菜单. 一个.图片菜单ui.newImageMenuItem(params) 參数: image: 正 ...
 - swift新手入门视频教程-08-枚举
			
我自己录制的swift菜鸟入门,大家拍砖,有什么问题能够在这里留言. 主要内容: 枚举语法(Enumeration Syntax) 匹配枚举值与Swith语句(Matching Enumeration ...
 - java.lang.IllegalStateException: You need to use a Theme.AppCompat theme
			
配置: 中设置theme为 <application android:allowBackup="true" android:icon="@mipmap/ic_lau ...
 - Ubuntu升级后apache所有的失败,以解决虚拟文件夹的设置
			
问题描述: 将Ubuntu离12.04升级到14.04后,出现apache配置的虚拟文件夹所有失效.所有站点域名所有定向到根文件夹.无法分别訪问! 尝试方法: 開始以为是升级后Apache的问题.已经 ...
 - POJ 1113 || HDU 1348: wall(凸包问题)
			
传送门: POJ:点击打开链接 HDU:点击打开链接 以下是POJ上的题: Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...
 - Lampda或Linq中的SqlFunctions.StringConvert()
			
要使用 Lampda或Linq中的SqlFunctions.StringConvert(), 需要引用命名空间using System.Data.Objects.SqlClient, 该函数可进行模拟 ...
 - 微信公众号PHP简单开发流程
			
原文:微信公众号PHP简单开发流程 微信公众号开发分傻瓜模式和开发者模式两种,前者不要考虑调用某些接口,只要根据后台提示傻瓜式操作即可,适用于非专业开发人员. 开发模式当然就是懂程序开发的人员使用的. ...
 - Hadoop之——CentOS构造ssh否password登录注意事项
			
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46388809 前提配置:使用root登录改动配置文件:/etc/ssh/sshd_ ...