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

当前回答

从@Mohit Mehta获得帮助,如果你正在使用导航组件,这可能会帮助你。这对我很有效。

在MainActivity的onActivityResult方法中粘贴以下代码:

for (Fragment fragment : navHostFragment.getChildFragmentManager().getFragments()){
        if (fragment != null){
            Log.d(TAG, "onResult Has Been Sent!");
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }

在YOUR FRAGMENT的onActivityResult方法中,你可以得到结果。 希望这对你有所帮助。

其他回答

如果在fragment类内部的onActivityResult方法有问题,并且你想要更新一些也在fragment类内部的东西,使用:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(resultCode == Activity.RESULT_OK)
    {
        // If the user had agreed to enabling Bluetooth,
        // populate the ListView with all the paired devices.
        this.arrayDevice = new ArrayAdapter<String>(this.getContext(), R.layout.device_item);
        for(BluetoothDevice bd : this.btService.btAdapater.getBondedDevices())
        {
            this.arrayDevice.add(bd.getAddress());
            this.btDeviceList.setAdapter(this.arrayDevice);
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

只要加上这个。变量,如上面代码所示。否则,该方法将在父活动中被调用,并且该变量不会在当前实例中更新。

我还通过将这段代码放到MainActivity中进行测试,用HomeFragment类替换它,并将变量设置为静态。我得到了我所期望的结果。

因此,如果你想让片段类拥有自己的onActivityResult实现,上面的代码示例就是答案。

对于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); } } } } }

最简单的方法之一是从你的片段开始一个活动。

startActivity(ActivityName);

然后,添加你调用startActivityForResult(intent,"1");在你的Activity中添加onActivityResult

startActivityForResult(intent,"1");

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
// perform other activity result like fetching from Uris or handling cursors

finish(); // finish the activity will  get to back to your fragment.
}

解决方案1:

调用startActivityForResult(intent, REQUEST_CODE);而不是getActivity()。startActivityForResult(意图,REQUEST_CODE);。

解决方案2:

当startActivityForResult(intent, REQUEST_CODE);调用活动的onActivityResult(requestCode,resultcode,intent),然后你可以从这里调用片段onActivityResult(),传递requestCode,resultcode和intent。

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

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

参见:Android Fragment API

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