从非活动类调用startActivityForResult()并在现有活动或片段中获取结果

时间:2018-06-29 11:16:19

标签: android startactivityforresult

我的IntentHelper类是

public class IntentHelper {

    private Activity activity;

    // Camera activity request code
    public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
    //Gallery activity request code
    public static final int GALLERY_OPEN_IMAGE_REQUEST_CODE = 101;

    public IntentHelper(Activity activity){
        this.activity = activity;
    }

    /**
     * Launching gallery to get image
     */
    public void getGalleryImage(){

        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("outputFormat",
                Bitmap.CompressFormat.JPEG.toString());

        activity.startActivityForResult(Intent.createChooser(intent, "Select Image"),GALLERY_OPEN_IMAGE_REQUEST_CODE);
    }
}

我从片段中将该类称为:

IntentHelper intentHelper = new IntentHelper(getActivity());
intentHelper.getGalleryImage();

我的图库意图已成功使用此逻辑打开。 但是:

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // following if condition is not executing
    if(requestCode == IntentHelper.GALLERY_OPEN_IMAGE_REQUEST_CODE)
    {
        if(resultCode == RESULT_OK){

            SnackbarHelper.showSnackBar("Image browsed sucessfully",getView());
            Toast.makeText(getContext(), "Image browsed successfully", Toast.LENGTH_SHORT).show();

        }
        else if(requestCode == RESULT_CANCELED){
            SnackbarHelper.showSnackBar("Image browsed cancelled",getView());
        }
    }
}

我不知道为什么会这样。 我的意图被完美地调用,并使我返回相同的活动,那么为什么此onActivityResult()条件无法正常工作?

  

我的所有代码都是片段。但是我不认为这会导致此问题

编辑-解决方案

@laalto给出的答案是正确的。我必须使用片段实例启动startActivityForResult()。

因此,我将IntentHelper类更改为:

public class IntentHelper {
/*
* Instead of Activity use Fragment
*/
private Fragment fragment;

// Camera activity request code
public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
//Gallery activity request code
public static final int GALLERY_OPEN_IMAGE_REQUEST_CODE = 101;

public IntentHelper(Fragment fragment){
    this.fragment = fragment;
}

/**
 * Launching gallery to get image
 */
public void getGalleryImage()  {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("scale", true);
    intent.putExtra("outputFormat",
            Bitmap.CompressFormat.JPEG.toString());

    // Use fragment for startActivityForResult() to initiate.
    fragment.startActivityForResult(Intent.createChooser(intent, "Select Image"),GALLERY_OPEN_IMAGE_REQUEST_CODE);
}

}

IntentHelper的启动方式为:

IntentHelper intentHelper = new IntentHelper(this);
intentHelper.getGalleryImage();

此更改之后,一切正常!!!!

3 个答案:

答案 0 :(得分:0)

我认为您可以在活动的onActivityResult中尝试此操作,调用super.onActivityResult()

和片段  在片段中,请确保您致电

startActivityForResult(intent,111); instead of getActivity().startActivityForResult(intent,111); inside your fragment.

答案 1 :(得分:0)

您必须致电 在片段本身容纳的super.onActivityResult(requestCode, resultCode, data);触发之前,容纳该片段的活动onActivityResult()中的onActivityResult()。只需在您的活动中添加以下内容:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

答案 2 :(得分:0)

  

我的所有代码都是片段。但是我不认为这会导致此问题

是问题。

如果您致电Activity#startActivityForResult(),则会收到onActivityResult的活动信息。

如果您致电Fragment#startActivityForResult(),则会在该片段中收到onActivityResult

(实际上,FragmentActivity将片段索引编码为请求代码的片段索引,以便将结果归为片段。)

因此,在活动中调用startActivityForResult()并期望看到片段中的结果不起作用。要么将请求移到片段中,要么将响应处理到活动中。

此外,如果您不处理结果,请将其传递给super实现。