BUG系列:转让startActivityForResult()&onActivityResult()没有反应

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

我使用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>     */

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

时间: 2024-11-12 19:29:46

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

Android基础:startActivityForResult 和 onActivityResult 问题

项目中用到弹出Acitivity来获得用户输入 所以用到 onActivityResult()方法接受用户输入 奇怪问题 startActivityForResult() 后直接调用 onActivityResult()    开发人员都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数.然而在项目中,还没等到被调用的 Activity 返回,onActivityResult() 就被执行了.找了很久,终于通过小道

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

人人都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数. 但你是否遭遇过onActivityResult()不执行或者未按预想的那样执行的情况呢? 这里我总结了三种情况: 1.执行startActivityForResult,没等到被调用的 Activity 返回,onActivityResult() 就被执行了. 找了很久,终于通过小道消息得知,这与 Activity 的加载模式(launchMode)有关,该

startActivityForResult and onActivityResult

startActivityForResult and onActivityResult startActivityForResult 开启Activity 组织数据之后 发送,onActivityResult 接受数据 1 public class MyActivity extends Activity { 2 ... 3 4 static final int PICK_CONTACT_REQUEST = 0; 5 6 protected boolean onKeyDown(int keyCod

BUG系列:调用startActivityForResult()&amp;onActivityResult()无响应

前天遇到了一个麻烦,还真是麻烦啊! 我使用startActivityForResult()&onActivityResult(),由Activity-A 跳转到Activity-B 页面,然后在Activity-B页面编辑完个人资料之后携带个人数据交回到Activity-A页面:其实很简单的问题,但是 让我没有预料到的是竟然出现了岔子!下面展示我的效果图及正确的代码: 这些代码是作为编辑昵称:<Activity-B页面> public class EditToNickNameAty e

startActivityForResult与onActivityResult

androidActivity之间的跳转不只是有startActivity(Intent i)的,startActivityForResult(Intent intent, int requestCode)也是常用的方法. 其作用是可以用onActivityResult(int requestCode, int resultCode, Intent data)方法获得请求Activity结束之后的操作.   需要注意三个方法:startActivityForResult(Intent inten

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

一.使用场景 在一个主界面(主Activity)通过意图跳转至多个不同子Activity上去,当子模块的代码执行完毕后再次返回主页面,将子activity中得到的数据显示在主界面/完成的数据交给主Activity处理.这种带数据的意图跳转需要使用activity的onActivityResult()方法. (1)startActivityForResult(Intent intent, int requestCode);  第一个参数:一个Intent对象,用于携带将跳转至下一个界面中使用的数据

margin 相关 bug 系列

原文地址:margin系列之bug巡演 by @doyoe IE6浮动双倍margin bug 这当是IE6最为经典的bug之一. 触发方式 元素被设置浮动 元素在与浮动一致的方向上设置margin值 来看看详细的代码吧: HTML <div id="demo"> <p>IE6下浮动方向上的margin值将会双倍于其指定值</p> </div> CSS #demo { overflow: hidden; width: 400px; mar

我所遇见的bug 系列1 win7在生成的程序里,播放音频时没声音

1 知识背景,需要具备基本的C/C++编程功能,能阅读c/++项目工程,了解注入的过程 ,了解基本的安全编程 2 需要的东东 注入的驱动及的程序,以及需要注入的dll 3 相关的工具 windbg win7x64虚拟机 pchunter64.exe procxp.exe 3 问题描述 在win7x64用我们自己的工具生成的程序,启动以后打开,视频,音频,播放时没声音 ,期望是有声音的 4 bug定位,bug 相关的代码主要是两大块,一个是驱动,一个是dll. 驱动在进程创建的时候把dll注入到进

【奇奇怪怪的bug系列】微信小程序

今天修改代码的时候,发现了一件让我很恐慌的事情,在app.json中修改页面路径顺序不起作用了: 这样我根本就看不到页面的效果啊??? 在折腾了半天后,才发现是一个比较乌龙的事情:昨天修改完首页后顺手把它设置成启动页了,相当于锁定成index页,今天再怎么改自然也没有用了. 只要在工具中找到编译配置,将自己锁定的页面改为"普通编译"即可 再次总结一下,设置某个页面为启动后的第一个页面有两种方法: 方法一.在spp.json中把路径放到第一个 app.json文件中的pages数组中,设