Android基础之——startActivityForResult启动界面并返回数据,上传头像

本文详细介绍了在Android应用开发中如何利用startActivityForResult方法实现界面间的数据回传与登录流程。通过一个小demo演示了如何在不同界面间传递数据,并在登录成功后返回主界面展示相关信息,包括启动界面、数据传递、结果返回及登录状态更新。还展示了上传头像功能的实现,涉及选择相册或拍照、裁剪图片以及上传到服务器的过程。

在android应用的开发过程中,经常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程。在很多应用程序的模块中,都有“我的”这个模块,在未登录状态下点击其中的某一项,就会弹出登录界面,登录完成后回到我的界面,会显示一些登录后的数据,这个功能的实现就要用到startActivityForResult.

下面通过一个小demo来说明一下startActivityForResult的使用,以及在实际开发中的一些应用。

demo的效果图如下:


主界面布局:

三个按钮,一个textview

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <Button  
  8.         android:id="@+id/btn_a"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_marginLeft="20dip"  
  12.         android:layout_marginTop="20dip"  
  13.         android:text="启动A界面并返回数据" />  
  14.   
  15.     <Button  
  16.         android:id="@+id/btn_b"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_marginLeft="20dip"  
  20.         android:layout_marginTop="20dip"  
  21.         android:text="启动B界面" />  
  22.   
  23.     <LinearLayout  
  24.         android:layout_width="match_parent"  
  25.         android:layout_height="wrap_content"  
  26.         android:layout_margin="20dip"  
  27.         android:orientation="horizontal" >  
  28.   
  29.         <Button  
  30.             android:id="@+id/btn_login"  
  31.             android:layout_width="wrap_content"  
  32.             android:layout_height="wrap_content"  
  33.             android:text="登录" />  
  34.           
  35.         <Button   
  36.             android:id="@+id/btn_logout"  
  37.             android:layout_width="wrap_content"  
  38.             android:layout_height="wrap_content"  
  39.             android:visibility="gone"  
  40.             android:text="注销"  
  41.             />  
  42.     </LinearLayout>  
  43.   
  44.     <TextView  
  45.         android:id="@+id/tv_content"  
  46.         android:layout_width="match_parent"  
  47.         android:layout_height="30dip"  
  48.         android:layout_marginLeft="20dip"  
  49.         android:layout_marginRight="20dip"  
  50.         android:layout_marginTop="20dip" />  
  51.   
  52. </LinearLayout>  


主界面java代码

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public void onClick(View v) {  
  2.         Intent intent ;  
  3.         // TODO Auto-generated method stub  
  4.         switch (v.getId()) {  
  5.         case R.id.btn_a:  
  6.             intent = new Intent(MainActivity.this, ActivityA.class);  
  7.             intent.putExtra("data""传递给A的数据");  
  8.             startActivityForResult(intent, A);  
  9.             break;  
  10.         case R.id.btn_b:  
  11.             intent = new Intent(MainActivity.this, ActivityB.class);  
  12.             intent.putExtra("data""传递给B的数据");  
  13.             startActivity(intent);  
  14.             break;  
  15.         case R.id.btn_login:  
  16.             intent = new Intent(MainActivity.this,LoginActivity.class);  
  17.             intent.putExtra("data""传递给登录界面的数据");  
  18.             startActivityForResult(intent, LOGIN);  
  19.             break;  
  20.         case R.id.btn_logout:  
  21.             btnLogin.setClickable(true);  
  22.             logout.setVisibility(View.GONE);  
  23.             btnLogin.setText("登录");  
  24.             break;  
  25.         default:  
  26.             break;  
  27.         }  
  28.     }  
  29.   
  30.     @Override  
  31.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  32.         // TODO Auto-generated method stub  
  33.         super.onActivityResult(requestCode, resultCode, data);  
  34.           
  35.         if (resultCode == RESULT_OK) {  
  36.             switch (requestCode) {  
  37.             case A:  
  38.                 Bundle bundle = data.getExtras();  
  39.                 String back = bundle.getString("back");  
  40.                 Toast.makeText(getApplicationContext(), "A界面传回来的数据为:::::::"+back, 0).show();  
  41.                 content.setText("A界面传回来的数据"+back);  
  42.                 break;  
  43.             case LOGIN:  
  44.                 Bundle loginBundle = data.getExtras();  
  45.                 String username = loginBundle.getString("username");  
  46.                 String passwrod = loginBundle.getString("password");  
  47.                 content.setText("登录界面传回来的数据"+username+":::::::"+passwrod);  
  48.                 btnLogin.setText("已登录");  
  49.                 btnLogin.setClickable(false);  
  50.                 logout.setVisibility(View.VISIBLE);  
  51.                 Toast.makeText(getApplicationContext(), username+"::::::::"+passwrod, 0).show();  
  52.                 break;  
  53.             default:  
  54.                 break;  
  55.             }  
  56.         }  
  57.           
  58.     }  

其中主要的地方有两个,一个是在启动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的代码如下:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         // TODO Auto-generated method stub  
  3.         super.onCreate(savedInstanceState);  
  4.         LinearLayout ll = new LinearLayout(this);  
  5.         LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,  
  6.                 LayoutParams.WRAP_CONTENT);  
  7.         ll.setLayoutParams(params);  
  8.         ll.setOrientation(LinearLayout.VERTICAL);  
  9.   
  10.         TextView tv = new TextView(this);  
  11.         tv.setText("我是A界面");  
  12.         ll.addView(tv);  
  13.   
  14.         Button close = new Button(this);  
  15.         close.setText("关闭界面并返回");  
  16.         close.setOnClickListener(new OnClickListener() {  
  17.             @Override  
  18.             public void onClick(View v) {  
  19.                 Intent intent = new Intent();  
  20.                 intent.putExtra("back""我是A界面返回的数据");  
  21.                 setResult(RESULT_OK, intent);  
  22.                 finish();  
  23.             }  
  24.         });  
  25.         ll.addView(close);  
  26.         setContentView(ll);  
  27.         Toast.makeText(getApplicationContext(),  
  28.                 getIntent().getExtras().getString("data"), 0).show();  
  29.     }  

注意其中有一段代码,是setResult(RESULT_OK, intent); 之后紧接着 finish();

activity要能成功返回数据,就必须在结束finish()之前调用setResult方法,该方法的两个参数,第一个为结果码,也就是onActivityResult方法中的第二个参数resultcode,一般情况下我们都设置该值为RESULT_OK


ActivityB由于使用的是startActivity 因此无需返回数据

ActivityB的代码如下:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         setContentView(R.layout.activityb);  
  4.   
  5.         Button close = (Button) findViewById(R.id.btn_close);  
  6.         close.setOnClickListener(new OnClickListener() {  
  7.             @Override  
  8.             public void onClick(View v) {  
  9.                 // TODO Auto-generated method stub  
  10.                 finish();  
  11.             }  
  12.         });  
  13.   
  14.         Toast.makeText(getApplicationContext(),  
  15.                 getIntent().getExtras().getString("data"), 0).show();  
  16.           
  17.     }  


LoginActivity的代码:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         // TODO Auto-generated method stub  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.login);  
  5.         etUsername = (EditText) findViewById(R.id.et_username);  
  6.         etPassword = (EditText) findViewById(R.id.et_password);  
  7.         Button login = (Button) findViewById(R.id.btn_login);  
  8.         login.setOnClickListener(new OnClickListener() {  
  9.             @Override  
  10.             public void onClick(View v) {  
  11.                 // TODO Auto-generated method stub  
  12.                 String password = etPassword.getText().toString().trim();  
  13.                 String username = etUsername.getText().toString().trim();  
  14.                 Toast.makeText(getApplicationContext(), "登录成功,返回原来界面"0)  
  15.                         .show();  
  16.                 Intent intent = new Intent();  
  17.                 intent.putExtra("username", username);  
  18.                 intent.putExtra("password", password);  
  19.                 setResult(RESULT_OK, intent);  
  20.                 finish();  
  21.             }  
  22.         });  
  23.   
  24.         Toast.makeText(getApplicationContext(),  
  25.                 getIntent().getExtras().getString("data"), 0).show();  
  26.   
  27.     }  


该界面登录成功后,将用户名和密码返回到主页面,并显示,同时主页面不能再次登录,可以使用注销操作。


到这里,这个小demo就完成了。

主要演示二个功能,一个是启动activity并带结果返回,将结果显示在页面上。

一个是启动activity不带结果返回,这种操作比较常用和简单。


完整的代码:http://download.youkuaiyun.com/download/yanglfree/7503139


下面再来说下startActivityForResult另一个比较常用的应用场景:上传头像


效果图如下:


点击头像后,弹出选择对话框,选择相册或者拍照,完成后会出现裁剪界面,裁剪完成后,会将头像显示在界面上,如果有服务器的话,会将头像上传到服务器。

看下几段关键的代码:

头像的点击事件:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public void onClick(View v) {  
  2.                 CharSequence[] items = { "查看头像""手机相册""手机拍照" };  
  3.                 new AlertDialog.Builder(MainActivity.this).setTitle("上传照片")  
  4.                         .setItems(items, new DialogInterface.OnClickListener() {  
  5.                             public void onClick(DialogInterface dialog,  
  6.                                     int which) {  
  7.                                 if (which == SELECT_PICTURE) {  
  8.                                     Intent intent = new Intent(  
  9.                                             Intent.ACTION_PICK);  
  10.                                     intent.setType("image/*");  
  11.                                     startActivityForResult(intent,  
  12.                                             PHOTO_REQUEST_GALLERY);  
  13.                                 } else if (which == SELECT_CAMERA) {  
  14.                                     Intent intent = new Intent(  
  15.                                             "android.media.action.IMAGE_CAPTURE");  
  16.                                     // 判断存储卡是否可以用,可用进行存储  
  17.                                     if (hasSdcard()) {  
  18.                                         intent.putExtra(  
  19.                                                 MediaStore.EXTRA_OUTPUT,  
  20.                                                 Uri.fromFile(new File(  
  21.                                                         Environment  
  22.                                                                 .getExternalStorageDirectory(),  
  23.                                                         PHOTO_FILE_NAME)));  
  24.                                     }  
  25.                                     startActivityForResult(intent,  
  26.                                             PHOTO_REQUEST_CAMERA);  
  27.                                 } else if (which == SELECT_SCAN) {  
  28.                                     // TODO 查看头像  
  29.                                 }  
  30.   
  31.                             }  
  32.                         }).create().show();  
  33.             }  
  34.         });  

其中,启动相册和拍照都是采用的startAcitivityForResult方法,并且,由于相册和拍照都是系统应用,因此,intent使用指定的intent

拍照: "android.media.action.IMAGE_CAPTURE"

相册:Intent.ACTION_PICK

在activityResult方法中:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public void onActivityResult(int requestCode, int resultCode, Intent data) {  
  2.         super.onActivityResult(requestCode, resultCode, data);  
  3.         if (resultCode == Activity.RESULT_OK) {  
  4.             if (requestCode == PHOTO_REQUEST_GALLERY) {// 图库  
  5.                 if (data == null) {  
  6.                     return;  
  7.                 }  
  8.                 Uri uri = data.getData();  
  9.                 crop(uri);  
  10.             } else if (requestCode == PHOTO_REQUEST_CAMERA) {// 拍照  
  11.   
  12.                 if (hasSdcard()) {  
  13.                     file = new File(Environment.getExternalStorageDirectory(),  
  14.                             PHOTO_FILE_NAME);  
  15.                     crop(Uri.fromFile(file));  
  16.                 } else {  
  17.                     Toast.makeText(this"未找到存储卡,无法存储照片!"0).show();  
  18.                 }  
  19.             } else if (requestCode == PHOTO_REQUEST_CUT) {// 裁剪  
  20.                 try {  
  21.                     bmp = data.getParcelableExtra("data");  
  22.                     photo.setImageBitmap(bmp);  
  23.                     File tempFile = BitmapUtils.saveBitmapFile(bmp,  
  24.                             PHOTO_FILE_NAME);  
  25.                     upload(tempFile);//上传到服务器   
  26.                     pd = new ProgressDialog(this);  
  27.                     pd.setMessage("头像正在上传中请稍后");  
  28.                     pd.show();  
  29.   
  30.                 } catch (Exception e) {  
  31.                     e.printStackTrace();  
  32.                 }  
  33.             }   
  34.         }  
  35.     }  

完整的代码下载: http://download.youkuaiyun.com/detail/yanglfree/7504613
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值