当相机活动返回时,承载这个片段的活动有它的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);
    }
}

当前回答

简而言之,

在fragment中,声明fragment fragment = this;

之后使用fragment.startActivityForResult。

结果将在activityResult中返回。

其他回答

如果你不知道活动中的片段,只需要枚举它们并发送活动结果参数:

/ / Java

// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

科特林

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        for (fragment in supportFragmentManager.fragments) {
            fragment.onActivityResult(requestCode, resultCode, data)
        }
    }

我强烈怀疑这里所有的答案只不过是黑客。我都试过了,但没有任何可靠的结论,因为总有一些愚蠢的问题。就我个人而言,我不能依赖不一致的结果。如果你看了Fragments的官方Android API文档,你会发现谷歌清楚地陈述了以下内容:

从包含Activity的片段调用startActivityForResult(Intent, int)。

参见:Android Fragment API

因此,似乎最正确和可靠的方法是实际调用startActivityForResult()从托管活动,也从那里处理结果的onActivityResult()。

宿主活动覆盖onActivityResult(),但它没有为未处理的结果代码调用super.onActivityResult()。显然,即使片段是执行startActivityForResult()调用的片段,活动也会首先处理结果。当您考虑片段的模块化时,这是有意义的。一旦我为所有未处理的结果实现了super.onActivityResult(),片段就有机会处理结果。

还有来自@siqing的回答:

为了在你的片段中得到结果,确保你调用startActivityForResult(intent,111);代替getActivity().startActivityForResult(intent,111);在你的碎片里。

如果在Facebook登录时遇到上述问题,那么你可以在你的片段的父活动中使用下面的代码:

Fragment fragment = getFragmentManager().findFragmentById(android.R.id.tabcontent);
fragment.onActivityResult(requestCode, resultCode, data);

Or:

Fragment fragment = getFragmentManager().findFragmentById("fragment id here");
fragment.onActivityResult(requestCode, resultCode, data);

并在你的片段中添加下面的调用…

callbackManager.onActivityResult(requestCode, resultCode, data);

对于那些使用Android导航组件的人,应该在Activity的onActivityResult(…)中使用primaryNavigationFragment来获取它的片段引用,并调用fragment的fragment.onActivityResult(…)

下面是Activity的onActivityResult(…)

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

    for (Fragment fragment : getSupportFragmentManager().getPrimaryNavigationFragment().getChildFragmentManager().getFragments())
    {
            fragment.onActivityResult(requestCode, resultCode, imageData);
    }
}