fragment中onActivityResult无法返回和在startActivityForResult调用后立即调用解决办法

在Fragment中使用startActivityForResult时遇到onActivityResult未响应的问题。解决方案包括:直接调用startActivityForResult,而非使用this.getActivity,以及检查目标Activity的launchMode,确保其为默认或标准模式。在FragmentActivity中重写onActivityResult并调用super方法可确保正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前都只是在activity中使用startActivityForResult和onActivityResult方法,是没有任何问题的

但是这次需要在fragment调用startActivityForResult,跳转到activity,在fragment中重写onActivityResult方法拿到返回值

就出了一点问题

首先,我是写的this.getActivity.startActivityForResult(intent,1);

结果发现onActivityResult方法完全没有响应

查找资料发现,要直接写startActivityForResult(intent,1); 千万不要加前面的this.getActivity等字段

这时候应该就可以调试到onActivityResult方法里面了,如果还没运行这个方法,可以在这个fragment依附的fragmentActivity中重写onActivityResult方法,调用super,就没问题了

然后可能会出现这个问题,每次startActivityForResult方法刚一调用,还没等activity返回,onActivityResult方法已经执行完了

为什么呢

其实非常简单,你是在manifest中对这些交互的某个activity设置了launchMode属性

只需要把launchMode属性去掉或者设置为标准模式,就可以了

这时候,就可以和activity一样正常的获取到返回值了


下面我贴上我自己的代码给大家参考一下

fragment中

Intent intent = new Intent(v.getContext(), SendImageDialog.class);
            startActivityForResult(intent, 1);

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (resultCode) {
        case 1:
            if (data != null) {
                //取得返回的Uri,基本上选择照片的时候返回的是以Uri形式
                Uri mImageCaptureUri = data.getData();
               
                //返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取
                if (mImageCaptureUri != null) {
                    String imageUrl=getPath(mImageCaptureUri);
                  
                    String imageuploadreturnUrl=ImageUpload.fileUpload(imageUrl);
                    //获取xml文件中的url
                    String urlMsg=subStrURL(imageuploadreturnUrl);
                    //发送到服务器
                    checkConnection(urlMsg, MESSAGETYPE.INT_TYPE_IMAGE);
                } else {
                    Bundle extras = data.getExtras();
                    if (extras != null) {
                        //这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
                        Bitmap image = extras.getParcelable("data");
                        String imageName = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".png";
                        if (image != null) {
                            //保存图片到sd卡,返回物理路径
                            String saveresult=ImageDownload.savePicToSdcard(image,FileUtil.IMG_PATH, imageName);
                            Log.d("TAG", "saveresult===="+saveresult);
                            String imageuploadreturnUrl=ImageUpload.fileUpload(saveresult);
                            String urlMsg=subStrURL(imageuploadreturnUrl);
                            checkConnection(urlMsg, MESSAGETYPE.INT_TYPE_IMAGE);
                        }
                    }
                    
                }

            }
            break;
        default:
            break;

        }
    }


activity

public class SendImageDialog extends Activity implements OnClickListener{
    
    private Button paizhao, xiangce, quxiao;
    private LinearLayout layout;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sendimage_dialog_layout);
        // dialog=new MyDialog(this);
        intent = getIntent();
        paizhao = (Button) this.findViewById(R.id.bt_paizhao);
        xiangce = (Button) this.findViewById(R.id.bt_xiangce);
        quxiao = (Button) this.findViewById(R.id.exitBtn1);
        layout = (LinearLayout) findViewById(R.id.exit_layout2);
        layout.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
                        Toast.LENGTH_SHORT).show();
            }
        });
        // 添加按钮监听
        paizhao.setOnClickListener(this);
        xiangce.setOnClickListener(this);
        quxiao.setOnClickListener(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        finish();
        return true;
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
        //选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用
        if (data.getExtras() != null){
            intent.putExtras(data.getExtras());
        }
        if (data.getData()!= null){
            intent.setData(data.getData());
        }
        setResult(1, intent);
        Log.d("TAG", "result1111");
        finish();

    }

    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_paizhao:
            try {
                //拍照用Action为MediaStore.ACTION_IMAGE_CAPTURE,
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, 1);
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
        case R.id.bt_xiangce:
            try {
                //选择照片的时候用Action为Intent.ACTION_GET_CONTENT,
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(intent, 2);
            } catch (ActivityNotFoundException e) {

            }
            break;
        case R.id.exitBtn1:
            finish();
            break;
        default:
            break;
        }

    }

}


在fragmentActivity中

@Override
    protected void onActivityResult(int arg0, int arg1, Intent arg2) {
        // TODO Auto-generated method stub
        super.onActivityResult(arg0, arg1, arg2);
    }


manifest就不贴了,直接去掉launchMode属性就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值