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

其他回答

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

还有来自@siqing的回答:

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

对于许多嵌套片段(例如,当在片段中使用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”。

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

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

参见:Android Fragment API

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

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

在你的主要活动:

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

在你的主顶级片段(ViewPager片段)中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
    frag.yourMethod(data);  // Method for callback in YourFragment
    super.onActivityResult(requestCode, resultCode, data);
}

在YourFragment(嵌套片段)中:

public void yourMethod(Intent data){
    // Do whatever you want with your data
}

有一点没有人提到,确保你的主机活动启动模式不能设置为singleInstance或singleTask。

如果你的启动模式设置为SingleInstance或SingleTask, onActivityResult将不起作用。或者你用这些IntentFilters调用你的activity

标准或单顶启动模式都可以工作。