您的位置:首页 > 其它

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

2014-08-15 10:02 555 查看
以前都只是在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属性就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐