前天遇到了一个麻烦,还真是麻烦啊。

我使用startActivityForResult()&onActivityResult()。由Activity-A 跳转到Activity-B 页面,然后在Activity-B页面编辑完个人资料之后携带个人数据交回到Activity-A页面。事实上非常easy的问题,可是 让我没有预料到的是居然出现了岔子。以下展示我的效果图及正确的代码:

这些代码是作为编辑昵称:<Activity-B页面>

public class EditToNickNameAty extends Activity implements OnClickListener{

	private EditText edtNickName;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState); setContentView(R.layout.aty_thedata_edit_nickname); findViewById(R.id.btn_back).setOnClickListener(this);
edtNickName=(EditText) findViewById(R.id.edt_nickName);
findViewById(R.id.img_nickNameCancell).setOnClickListener(this);
findViewById(R.id.btnOk).setOnClickListener(this); } @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.img_nickNameCancell://昵称清空设置键
edtNickName.setText("");
break;
case R.id.btnOk:
nickNameHandleViews();
break;
case R.id.btn_back:
finish();
overridePendingTransition(R.anim.loadout_from_enter,R.anim.loadout_from_exit);
break;
default:
break;
}
} private void nickNameHandleViews() {
// TODO Auto-generated method stub
String result = edtNickName.getText().toString();
Intent resultFor=new Intent(this, PersonalDataEditAty.class);
if(TextUtils.isEmpty(result)){
result = "";
}
Bundle data = new Bundle();
data.putString("result", result);
resultFor.putExtras(data);
//设置结果并进行传输
this.setResult(PersonalDataEditAty.ATY_CODE_NICKENAME, resultFor);
this.finish();
}
}

Activity-B页面:

跳转button作跳转监听:

case R.id.lay_item_nikeName:
Intent nickName = new Intent(this, EditToNickNameAty.class);
startActivityForResult(nickName, 10);//ATY_CODE_NICKENAME
overridePendingTransition(R.anim.loadin_from_enter,R.anim.loadin_from_exit);
break;

接收从Activity-A携带过来的数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if(resultCode==ATY_CODE_NICKENAME){//昵称
Log.d("json", "//昵称"+data.getExtras().getString("result"));
if(OperationTool.isNetWorkConnected(this)){
resetNickName = data.getExtras().getString("result");
get(mHandler, UrlFinalcons.url+"member_edit? "+"token="+token+"&nick="+resetNickName, NormalFinalcons.NICK_NAME);
} }

当中一些细节问题这里提一下:

在onActivityResult()。方法參数中參数--int resultCode  --int requestCode  --Intent data

当中,

resultCode:是Activity-A页面 startActivityForResult(intent,resultCode); 中与该跳转方法的第二个參数匹对且相等;

requestCode:是Activity-B页面 setResult(requestCode, intent);中与该跳转方法的第一个參数匹配且相等;

data:是Activity-B页面 setResult(requestCode, intent);中与该跳转方法的第二个參数匹配且相等。

注意:startActivityForResult(intent,resultCode);中的resultCode最好不要与setResult(requestCode, intent);中的requeCode相等。resultCode>0

最后解决实际问题:为什么我的全部的配置都做了。就是不能由B------->A的正常跳转呢?

原因一:与 Activity 的载入模式(launchMode)有关;Activity的载入模式,在这样的的跳转的方式下要使用标准模式(我就是使用了 android:launchMode="singleTop"模式,结果不能正常跳转)

原因二:调用startActivityForResult的參数问题。即原先调用时这样:startActivityForResult(intent, 0);是第二个參数的问题。该參数必须大于0才干在返回值,并激活onActivityResult方法。

原因三:在TabHost的子Activity中startActivityForResult调用其它Activity时候遭遇到onActivityResult方法不响应的问题;

解决方式:

1.通过父Activity启动其它Activity;

2.实现父Activity的onActivityResult方法,将该处接收到的请求转发给当前活动的子Activity;

3.自己定义一个转发接口用来实现第2步中的转发功能;

4.子Activity中实现第3步接口中的方法用来接收返回信息;

代码例如以下:

1.通过父Activity启动其它Activity

 getParent().startActivityForResult(new Intent(...), REQUEST_CODE);

2.实现父Activity的onActivityResult方法

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 获取当前活动的Activity实例
Activity subActivity = getLocalActivityManager().getCurrentActivity();
//推断是否实现返回值接口
if (subActivity instanceof OnTabActivityResultListe<wbr>ner) {
//获取返回值接口实例
OnTabActivityResultListe<wbr>ner listener = (OnTabActivityResultListe<wbr>ner) subActivity;
//转发请求到子Activity
listener.onTabActivityResult(requestCode, resultCode, data);
}
super.onActivityResult(requestCode, resultCode, data);
}

3.自己定义接口

public interface OnTabActivityResultListener {

    public void onTabActivityResult(int requestCode, int resultCode, Intent data);

}

4.子Activity须要实现onTabActivityResult方法

@Override

    public void onTabActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {

            //实现该处逻辑

        ...

        }

    }
/** <span>凡是Activity本身含有上次父类的情况都不能直接使用startActivityForResult。而要通过getParent()。通过父类调用此方法。</span>     */

版权声明:本文博客原创文章,博客,未经同意,不得转载。

BUG系列:转让startActivityForResult()&amp;onActivityResult()没有反应的更多相关文章

  1. Android基础:startActivityForResult 和 onActivityResult 问题

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

  2. Android学习 之 startActivityForResult 和 onActivityResult

    startActivityForResult 和 onActivityResult() 作用:主要用于 主Activity向调用的 子Activity 获得数据. 使用方法:在 主Activity写 ...

  3. 总结:调用startActivityForResult,onActivityResult无响应的问题

    人人都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数. 但你是否遭遇过onActivityResult()不执行或 ...

  4. IE CSS Bug 系列

    1.[IE CSS Bug系列]IE6&IE7图片链接无效 <!doctype html> <html> <head> <meta charset=& ...

  5. startActivityForResult and onActivityResult

    startActivityForResult and onActivityResult startActivityForResult 开启Activity 组织数据之后 发送,onActivityRe ...

  6. 调用startActivityForResult,onActivityResult无响应的解决办法

    三种情况: 1.执行startActivityForResult,没等到被调用的 Activity 返回,onActivityResult() 就被执行了.找了很久,终于通过小道消息得知,这与 Act ...

  7. Android的startActivityForResult()与onActivityResult()与setResult()参数分析,activity带参数的返回

    一.使用场景 在一个主界面(主Activity)通过意图跳转至多个不同子Activity上去,当子模块的代码执行完毕后再次返回主页面,将子activity中得到的数据显示在主界面/完成的数据交给主Ac ...

  8. [Android学习笔记]startActivityForResult和onActivityResult的使用

    发开过程中,免不了多个页面之间相互交互通信. Android中使用startActivityForResult方法和onActivityResult配合完成任务 startActivityForRes ...

  9. Android使用 startActivityForResult 、 onActivityResult 时的注意事项

    今天使用 startActivityForResult 时遇到两个问题,应该是常见问题了吧,浪费了些时间才搞定,做个记录. 1. onActivityResult 的触发顺序问题 这个问题很郁闷,我一 ...

随机推荐

  1. 将表中null值替换成想要的值、查询某一列值为null

    用到ISNULL()函数 例如:SELECT 其他列名,ISNULL(列名,替换值)as 重命名  from 表名 (简单参考:http://www.cnblogs.com/netsa/archive ...

  2. C# - Environment类,获取桌面的路径

    private void button1_Click(object sender, EventArgs e) { string Path = Environment.GetFolderPath(Env ...

  3. c语言, objective code(new 1)

    c struct, objective code //////// //// typedef int (*PF_EAT) (char* food, const int cnt); typedef in ...

  4. iOS - 单例传值 (一)

    点击打开链接    iOS - 单例传值 (二) 单例只会对某个类实例化一次/单例类,对单例这个类实例化一次有且仅有一个对象 你单例初始化,只能初始化一次,然后你指向的对象,其实都是指向一个内存地址, ...

  5. 在Windows上使用CodeLite+MinGW+Clang进行开发

    前几天听说clang 3.4已经release了,然后我又手痒就折腾一下,在这里记录一下折腾的经过. 在以前就试过clang-cl+VC的开发环境,编译代码到是没发现什么大问题,有不少警告而已,不过c ...

  6. 设置HTTP代理

    Maven通过<<UserHome>>/.m2/settings.xml(如果没有该文件,复制<<MavenHome>>/conf/settings.x ...

  7. [Oracle]TRIGGER

    题外话: Oracle 的使用. 以前客户方用的是SQL SERVER,一直在用SQL SERVER,感觉SQL SERVER的用户体验非常好. 不管是开发环境的界面布局到SQL 的写法上,感觉写起来 ...

  8. MySQL存储引擎:InnoDB和MyISAM的差别/优劣评价/评测/性能测试

    InnoDB和MyISAM简介 MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写 ...

  9. 管理集群中的 crs 管理员

     管理集群中的 crs 管理员 oracle Managing CRS Administrators in the Cluster Use the following commands to ma ...

  10. 重操JS旧业第二弹:数据类型与类型转换

    一 数据类型 1 js中的数据类型 1.1 数据类型列举 1)number类型 2)boolean类型 3)string类型 4)对象类型 5)函数类型 6)undefined类型 1.2 数据类型获 ...