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

当前回答

只需简单地调用:

startActivityForResult(intent, "1");

其他回答

我的问题是与主机活动,我发现它与一个设置android:launchMode=“标准”,我删除它临时,它工作!

原来的帖子。

FragmentActivity用修改过的requestCode替换requestCode。之后,当onActivityResult()将被调用时,FragmentActivity将解析较高的16位并恢复原始Fragment的索引。看看这个方案:

如果在根级别上有一些片段,就没有问题。但是如果你有嵌套的片段,比如在ViewPager里面有几个标签的片段,你肯定会遇到问题(或者已经遇到了)。

因为只有一个索引存储在requestCode中。这是Fragment在FragmentManager中的索引。当我们使用嵌套片段时,会有子片段管理器,它们有自己的片段列表。因此,有必要保存从根FragmentManager开始的整个索引链。

我们如何解决这个问题?在这篇文章中有一个常见的变通方案。

GitHub: https://github.com/shamanland/nested-fragment-issue

在我的情况下,这是一个Android漏洞(http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/),如果你使用支持FragmentActivity,你必须使用getSupportFragmentManager而不是getChildFragmentManager:

List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
    for (Fragment fragment : fragments) {
        if(fragment instanceof UserProfileFragment) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}

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

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

android:noHistory="false"

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

android:launchMode="standard"

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

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

参见:Android Fragment API

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