当相机活动返回时,承载这个片段的活动有它的onActivityResult被调用。

我的片段开始一个活动的结果与意图发送给相机拍照。图片应用程序加载正常,拍摄照片并返回。然而onActivityResult从未被击中。我设置了断点,但什么都没有触发。一个片段可以有onActivityResult吗?我想是的,因为它是一个已提供的函数。为什么这个没有被触发?

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, 1888);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == 1888 ) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
    }
}

当前回答

在你的片段中,调用

this.startActivityForResult(intent, REQUEST_CODE);

这里this指的是片段。否则就照@Clevester说的做:

Fragment fragment = this;
....
fragment.startActivityForResult(intent, REQUEST_CODE);

我还得打电话

super.onActivityResult(requestCode, resultCode, data);

在父活动的onActivityResult中使其工作。

(我改编自@Clevester的回答。)

其他回答

我也面临着同样的问题,一旦我把这段代码从一个片段转移到一个实用工具类,将parentActivity作为参数传递,

Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);
parentActivity.startActivityForResult(intent,requestCode);

然后我没有得到任何值在onActivityResult方法的片段, 之后,我把参数改为Fragment,所以修改后的method定义是这样的,

Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);
fragment.startActivityForResult(intent,requestCode);

在那之后,我能够在片段上的onActivityResult中获得值

简而言之,

在fragment中,声明fragment fragment = this;

之后使用fragment.startActivityForResult。

结果将在activityResult中返回。

这是最受欢迎的问题之一。我们可以找到很多关于这个问题的帖子。但没有一个对我有用。

所以我用这个方法解决了这个问题。

让我们先来理解为什么会发生这种情况。

我们可以直接从Fragment调用startActivityForResult,但实际上背后的机制都是由Activity处理的。

一旦你从一个Fragment中调用startActivityForResult, requestCode将会被改变以附加Fragment的标识到代码中。这将使Activity能够在收到结果后跟踪发送此请求的人。

一旦Activity被导航回来,结果将被发送到Activity的onActivityResult和修改后的requestCode,它将被解码为原始的requestCode + Fragment的标识。之后,Activity会通过onActivityResult将ActivityResult发送给那个Fragment。一切都完成了。

问题是:

Activity只能将结果发送给直接附加到Activity的Fragment,而不能发送给嵌套的Fragment。这就是为什么嵌套片段的onActivityResult无论如何都不会被调用的原因。

解决方案:

1)通过以下代码开始你的片段的意图:

       /** Pass your fragment reference **/
       frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345

2)现在在你的父活动覆盖**onActivityResult():**

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

你必须在parent activity中调用它才能使它工作。

3)在你的片段调用中:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {

       }
}

就是这样。 有了这个解决方案,它可以应用于任何单个片段,无论它是否嵌套。是的,它也涵盖了所有的情况!此外,代码也很漂亮和干净。

对于许多嵌套片段(例如,当在片段中使用ViewPager时)

在你的主要活动:

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

在你的片段中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getChildFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

在你的嵌套片段中

调用活动

getParentFragment().startActivityForResult(intent, uniqueInstanceInt);

uniqueInstanceInt—将其替换为嵌套片段中唯一的int,以防止另一个片段处理答案。

接收响应

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == uniqueInstanceInt ) {
        // TODO your code
    }
}

注意

在uniqueInstanceInt中需要使用0到65536之间的数字,以避免错误“只能使用低16位的requestCode”。

如果还有人做不到,我可以加两个建议。在Manifest.xml文件中,确保主机活动在回调时没有结束,并且要启动的活动具有标准的启动模式。 详情如下:

对于托管活动,如果有,则将no history属性设置为false

android:noHistory="false"

对于要启动的Activity,如果有,将启动模式设置为标准

android:launchMode="standard"