Android学习笔记(8)————详细谈谈intent的startActivityForResult()方法
来源:互联网 发布:淘宝怎么使用不了花呗 编辑:程序博客网 时间:2024/05/21 09:58
/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
1、两种实现activity跳转的方法
实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();
例如activity A跳转到activity B
对于,第一种,是把activity A的数据,通过intent传送到activity B,但是不能返回数据。
关于第一种,可以参考我之前的这篇博文
http://blog.csdn.net/conowen/article/details/7270393
2、第二种方法startActivityForResult()的详细用法
今晚谈的是第二种方法startActivityForResult();可以实现把activity A数据传送给activity B,也可以把activity B的数据返回来给activity A处理。
public void startActivityForResult (Intent intent, int requestCode)
首先startActivityForResult 有两个参数,第一个为当前activity的intent(假设为activity A),至于第二个参数的用法,还是先看一下官方SDK文档的解释
requestCode : If >= 0, this code will be returned in onActivityResult() when the activity exits.
一般都是设置大于或者等于0,因为activity A可能不单单要跳转到activity B,也可能跳转到activity C,D,E……,这些activity返回来的数据都交由activity处理,那activity又通过什么来分辨返回来的数据到底是哪个activity回来的呢。
所以在activity A跳转到某一个activity时,要设定目标activity的requestCode,这个requestCode就唯一地标识了相对应的activity。
如下所示,当要跳转到activity B时,15表示是activity B的标识,
IntentActivity.this.startActivityForResult(intent, 15);同理,当在activity A的另外一个监听器要跳转到activity C时,设定activity C的标识为25。(大于或者等于0就行了)
IntentActivity.this.startActivityForResult(intent, 25);
(通过onActivityResult方法可处理代表不同activity的requestCode数值,详细用法在第3点。)
3、数据处理方法onActivityResult()详解
然后activity A通过复写onActivityResult方法来处理这些activity返回来的数据。onActivityResult定义如下:
protected void onActivityResult (int requestCode, int resultCode, Intent data)
3.1、数据处理方法onActivityResult()有三个参数,第一个requestCode是用来区分哪个activity回来的数据,可以通过swith语句来筛选。
基本框架代码如下:
switch (requestCode) {case 15:switch (resultCode) {case 0://do somethingbreak;case 1://do something break;default:break;}break;case 25:switch (resultCode) {case 0: //do somethingbreak;default:break;} default: break; }
3.2、第二个参数为resultCode,也是一个int类型,如果activity B有几种不同返回的结果,同样地可以通过resultCode来筛选。
当跳转到其他activity时,如activity B。需要知道的是,把activity B的数据返回去给activity A的处理方法是setResult (int resultCode, Intent data) ,可以看到它的第一个参数是resultCode,也就是对应着相应的处理方式,官方的推荐取值如下,这些是宏变量,实质是int。当然也可以自定义为数值,自己习惯就行了。
RESULT_CANCELEDRESULT_OKRESULT_FIRST_USER
具体做法如下:如你可以在activity B做如下设置,两个button的监听器对应着两个resultCode,也就对应了两种处理方式,至于你要做什么事,在监听器定义即可。
button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//do somethingsecondactivity.this.setResult(0, intent);secondactivity.this.finish();}});button2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//do somethingsecondactivity.this.setResult(1, intent);secondactivity.this.finish();}});
3.3、第三个参数为Intent data,为activity返回来的数值,如通过data.getStringExtra("key");就可以取出来。
注意:调用setResult()方法跳回原来的activity时,一定要调用finish方法结束当前的activity
另外,如果activity A只需要跳转到activity B而已,那跳转时,request code只要大于或者等于0就行,而数据处理的方法onActivityResult()如下结构就行了,不用筛选request code。
switch (resultCode) {case 0://do somethingbreak;case 1://do something break;default:break;}
===============================================================================================
附上详细代码
从第一个activity跳到第二个,主要是验证 resultCode,
从第一个activity跳到第三个activity 和跳到第二个activity,主要是验证requestCode
效果图:
//IntentActivity为第一个activitypackage conowen.Activity.intent;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.TextView;import android.widget.Toast;public class IntentActivity extends Activity {/** Called when the Activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button bt = (Button) findViewById(R.id.bt);Button bt2 = (Button) findViewById(R.id.bt13);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(IntentActivity.this,secondactivity.class);// 将intent绑定到第二个activity,然后开始跳转到第二个ActivityIntentActivity.this.startActivityForResult(intent, 15);// 第二个参数为requestCode,大于或等于0,}});bt2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(IntentActivity.this,requestCodetest.class);//将intent绑定在第三个activityIntentActivity.this.startActivityForResult(intent, 25);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);switch (requestCode) {// 通过requestCode来辨别数据来自哪个activitycase 15:// 取得来自Activity2的数据,并显示于画面上switch (resultCode) {// 通过resultCode来辨别activity的相应处理方法case 0:String resultstr1 = data.getStringExtra("result");// 取出传回来的数据TextView tv = (TextView) findViewById(R.id.tv);tv.setText(resultstr1);// 显示出来break;case 1:String resultstr2 = data.getStringExtra("result");TextView tv1 = (TextView) findViewById(R.id.tv);tv1.setText(resultstr2);Toast.makeText(this,"第2个activity的requestCode的值为" + requestCode,Toast.LENGTH_LONG).show();break;default:break;}break;case 25:switch (resultCode) {case RESULT_OK:String resultstr3 = data.getStringExtra("result3");Toast.makeText(this,"第3个activity的requestCode的值为" + requestCode,Toast.LENGTH_LONG).show();TextView tv = (TextView) findViewById(R.id.tv);tv.setText(resultstr3);break;default:break;}default:break;}}}
//secondactivity为第二个activitypackage conowen.Activity.intent;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 secondactivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.secondactivity);// 获取启动这个activity的intentButton returnbt1 = (Button) findViewById(R.id.returnbt1);final Intent intent = getIntent();returnbt1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubEditText et = (EditText) findViewById(R.id.et);String res = et.getText().toString();intent.putExtra("result", res);// 把数据塞入intent里面secondactivity.this.setResult(0, intent);// 跳转回原来的activitysecondactivity.this.finish();// 一定要结束当前activity}});Button returnbt2 = (Button) findViewById(R.id.returnbt2);returnbt2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubintent.putExtra("result", "验证result code");secondactivity.this.setResult(1, intent);secondactivity.this.finish();}});}}
//requestCodetest是第三个activitypackage conowen.Activity.intent;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 requestCodetest extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.requestcode);// layout的xml文件名不能为大写字母Button bt3 = (Button) findViewById(R.id.returnbt3);bt3.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub// 这个activity主要是为了验证requestCodeEditText et3 = (EditText) findViewById(R.id.et3);Intent intent = getIntent();// 获取启动这个activity的intentString res = et3.getText().toString();intent.putExtra("result3", res);requestCodetest.this.setResult(RESULT_OK, intent);requestCodetest.this.finish();}});}}
- Android学习笔记(8)————详细谈谈intent的startActivityForResult()方法
- 【原创】Android学习笔记(8)————详细谈谈intent的startActivityForResult()方法
- Android学习笔记(8)————详细谈谈intent的startActivityForResult()方法 .
- 详细谈谈intent的startActivityForResult()方法
- Android—startActivityForResult的用法
- Android—startActivityForResult的使用
- Android笔记——startActivityForResult使用
- android学习笔记——Intent
- android学习笔记——intent
- android学习笔记1——Intent
- Android学习笔记——Intent
- Android学习笔记02——Intent的使用
- River的Android学习笔记——Intent意图
- 隐式Intent的使用——Android学习笔记3
- android学习笔记——Intent的解析(Intent的隐式调用)
- Android学习笔记7——Intent和Intent Filters的介绍
- Android学习笔记3——学习intent
- Android学习笔记(四)Activiy学习——Intent,context
- 命里有时终须有,命里无时莫强求
- 存储过程的分页
- hibernate1.2
- 黑马程序员---枚举的详解
- 利用CSS3特性巧妙实现漂亮的DIV箭头
- Android学习笔记(8)————详细谈谈intent的startActivityForResult()方法
- 发发牢骚
- spring mvc注入配置文件里的属性
- socket编程原理
- 目前人生阶段的关键字
- Oracle 批量导出 Sequence
- HibernateSystemException--ids for this class must be manually assigned before calling save()
- 基于Ruby On Rails的项目(包括Plugin)网址收集
- Oracle IO问题解析