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

当前回答

对于Android的导航组件,当你嵌套fragment时,这个问题就像一个无法解决的谜。

基于以下回答的知识和灵感,我想出了一个简单的解决方案:

在这篇文章中回答 在这篇文章中回答

在你的活动的onActivityResult()中,你可以循环使用FragmentManager的getFragments()方法获得的活动片段列表。

请注意,要做到这一点,您需要使用getSupportFragmentManager()或目标API 26及以上。

这里的想法是循环遍历列表,使用instanceof检查列表中每个Fragment的实例类型。

虽然循环这个Fragment类型的列表是理想的,但不幸的是,当你使用Android导航组件时,列表将只有一个项目,即NavHostFragment。

现在怎么办?我们需要让碎片知道NavHostFragment。NavHostFragment本身就是一个Fragment。因此,使用getChildFragmentManager(). getfragments(),我们再次得到一个List<Fragment>的片段已知我们的NavHostFragment。我们循环遍历这个列表,检查每个Fragment的实例。

一旦我们在列表中找到我们感兴趣的片段,我们就调用它的onActivityResult(),将活动的onActivityResult()声明的所有参数传递给它。

// Your activity's onActivityResult() @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); List<Fragment> lsActiveFragments = getSupportFragmentManager().getFragments(); for (Fragment fragmentActive : lsActiveFragments) { if (fragmentActive instanceof NavHostFragment) { List<Fragment> lsActiveSubFragments = fragmentActive.getChildFragmentManager().getFragments(); for (Fragment fragmentActiveSub : lsActiveSubFragments) { if (fragmentActiveSub instanceof FragWeAreInterestedIn) { fragmentActiveSub.onActivityResult(requestCode, resultCode, data); } } } } }

其他回答

只需简单地调用:

startActivityForResult(intent, "1");

在我的案例中,我在开发人员选项中打开了“不保留活动”,这导致了这个问题。

说不定能帮到别人。

如果你正在使用嵌套片段,这也是可行的:

getParentFragment().startActivityForResult(intent, RequestCode);

除此之外,你还得打电话给管理员。来自父activity的onActivityResult,并填充片段的onActivityResult方法。

Kotlin版本(在你的活动onActivityResult()中)

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    //add following lines in your activity
    if(supportFragmentManager?.fragments!=null && supportFragmentManager?.fragments!!.size>0)
     for (i in 0..supportFragmentManager?.fragments!!.size-1) {
         val fragment= supportFragmentManager?.fragments!!.get(i)
         fragment.onActivityResult(requestCode, resultCode, data)
    }
 }

大多数答案都说你必须在你的Fragment的宿主Activity中调用super.onActivityResult(…)。但这似乎对我不起作用。

所以,在你的主机活动中,你应该调用你的片段onActivityResult(…)。这里有一个例子。

public class HostActivity extends Activity {

    private MyFragment myFragment;

    protected void onActivityResult(...) {
        super.onActivityResult(...);
        this.myFragment.onActivityResult(...);
    }
}

在HostActivity的某些时候,你需要分配这个。你正在使用的片段。或者,使用FragmentManager来获取Fragment,而不是在HostActivity中保留对它的引用。另外,在你尝试调用this.myFragment.onActivityResult(…);;