• 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>     */

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

  • 相关阅读:
    import cv2出现“ImportError: DLL load failed: 找不到指定的模块”
    Ubuntu 18.04 安装MySQL
    在Pycharm中自动添加时间日期作者等信息
    Ubuntu18.04安装Python虚拟环境
    Windows10远程报错:由于CredSSP加密Oracle修正
    Ubuntu 18.04LTS 更新镜像配置
    jetbrains的JetBrains PyCharm 2018.3.1破解激活到2100年(最新亲测可用)
    解决爬虫中遇到的js加密问题之有道登录js逆向解析
    利用远程服务器在docker容器搭建pyspider运行时出错的问题
    linux服务器安装pyspide关于rgnutls.h: No such file or directory 的解决方案
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4679738.html
Copyright © 2020-2023  润新知