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

时间:2022-09-21 21:39:33

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

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

demo的效果图例如以下:

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

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

主界面布局:

三个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

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

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返回到主页面,并显示,同一时候主页面不能再次登录,能够使用注销操作。

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

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

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

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

一个是启动activity不带结果返回,这样的操作比較经常使用和简单。

完整的代码:http://download.csdn.net/download/yanglfree/7503139

以下再来说下startActivityForResult还有一个比較经常使用的应用场景:上传头像

效果图例如以下:

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

Android基础之——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启动界面并返回数据,上传头像的更多相关文章

  1. Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)

    Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件第二版 上次粗略的写了相同功能的代码,这次整理修复了之前的一些BUG,结构也大量修改 ...

  2. 上传头像&comma;界面无跳转&comma;php&plus;js

    上传头像,界面无跳转的方式很多,我用的是加个iframe那种.下面直接上代码. html: //route 为后端接口//upload/avatar 为上传的头像的保存地址//imgurl=/uplo ...

  3. Android Studio如何配置CURL指令一键打包apk上传至蒲公英

    Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...

  4. Android基础:startActivityForResult 和 onActivityResult 问题

    项目中用到弹出Acitivity来获得用户输入 所以用到 onActivityResult()方法接受用户输入 奇怪问题 startActivityForResult() 后直接调用 onActivi ...

  5. Android基础知识04—Activity活动之间传递数据

    ------活动之间传递数据------ 向下一个活动传递数据: Intent中提供了一系列的putExtra()方法,可以把数据暂存到Intent中,启动另一个活动的时候就可以取出来. 代码: (存 ...

  6. 【Android 复习】:从Activity中返回数据

    在实际的应用中,我们不仅仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递类似,也可以采用上一讲中的四种方式来传递数据,但是一般建议采用Intent对象的方式的来返 ...

  7. 让Android中的webview支持页面中的文件上传

    android webview在默认情况下是不支持网页中的文件上传功能的: 如果在网页中有<input type="file" />,在android webview中 ...

  8. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  9. Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件

    折腾了好几天的 HTTP 终于搞定了,经测试正常,不过是初步用例测试用的,因为后面还要修改先把当前版本保存在博客里吧. 其中POST因为涉及多段上传需要导入两个包文件,我用的是最新的 httpmine ...

随机推荐

  1. Android缓存学习入门&lpar;二&rpar;

    本文主要包括以下内容 内存缓存策略 文件缓存策略 内存缓存策略 当有一个图片要去从网络下载的时候,我们并不会直接去从网络下载,因为在这个时代,用户的流量是宝贵的,耗流量的应用是不会得到用户的青睐的.那 ...

  2. eclipse ctrl&plus;左击不能关联相应文件

    <?xml version="1.0" encoding="UTF-8"?><projectDescription> <name& ...

  3. 【推理,贪心】UVa 1319 - Maximum

    看到了大神的代码.理解了好久...真是差距. 题意:给出m, p, a, b,然后xi满足已下两个公式, 求 xp1 + xp2 +...+ xpm 的最大值. 1.-1/sqrt(a) <= ...

  4. &lbrack;转&rsqb;flume-ng&plus;Kafka&plus;Storm&plus;HDFS 实时系统搭建

    http://blog.csdn.net/weijonathan/article/details/18301321 一直以来都想接触Storm实时计算这块的东西,最近在群里看到上海一哥们罗宝写的Flu ...

  5. IE attachEvent事件处理程序&lpar;事件绑定的函数&rpar;的this指向的是window不是执行当前事件的dom元素

    IE attachEvent事件处理程序(事件绑定的函数)的this指向的是window不是执行当前事件的dom元素. attachEvent(type,listener); listener函数中的 ...

  6. JavaScript在智能手机上的应用-通过滑动修改网页字体大小

    ---------------------------------- <script type="text/javascript">            //变量x, ...

  7. VIM常用快捷键(转载)

    移动光标 h,j,k,l 上,下,左,右 ctrl-e 移动页面 ctrl-f 上翻一页 ctrl-b 下翻一页 ctrl-u 上翻半页 ctrl-d 下翻半页 w 跳到下一个字首,按标点或单词分割 ...

  8. Lintcode225-Find Node in Linked List-Naive

    225. Find Node in Linked List Find a node with given value in a linked list. Return null if not exis ...

  9. 关于C语言实现判断给定一个数,判断其是否是一个质数&lpar;素数&rpar;。

    Annotation:⒈我们需要明确0,1既不是质数,又不是合数.⒉其次我们需要知道一个质数,质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数.(自然数:自然数用以计量事物的件数或表示事 ...

  10. 关于margin padding

    margin padding设置百分比是以父元素的宽度作参考. 定位的left,top等取百分比 则以参照定位元素的padding+width做参考 margin 四个同时设定 以margin-lef ...