协慌网

登录 贡献 社区

片段中没有调用 onActivityResult

托管此片段的活动在摄像头活动返回时调用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);
    }
}

答案

托管活动会覆盖onActivityResult() ,但它没有调用super.onActivityResult()来处理未处理的结果代码。显然,即使片段是进行startActivityForResult()调用的片段,该活动也会获得处理结果的第一个镜头。当您考虑片段的模块化时,这是有意义的。一旦我为所有未处理的结果实现了super.onActivityResult() ,该片段就可以处理结果。

而且来自 @siqing 的回答:

要在片段中获得结果,请确保调用startActivityForResult(intent,111);而不是getActivity().startActivityForResult(intent,111);你的片段里面。

我认为你调用了getActivity().startActivityForResult(intent,111); 。你应该调用startActivityForResult(intent,111);

选项 1:

如果你调用startActivityForResult()从片段,那么你应该调用startActivityForResult()而不是getActivity().startActivityForResult()因为它会导致片段 onActivityResult()。

如果你不确定你在哪里调用startActivityForResult()以及你将如何调用方法。

选项 2:

由于 Activity 获取onActivityResult()的结果,因此您需要覆盖活动的onActivityResult()并调用super.onActivityResult()以传播到未处理的结果代码或所有的相应片段。

如果以上两个选项不起作用,请参考选项 3,因为它肯定会起作用。

选项 3:

从片段到 onActivityResult 函数的显式调用如下。

在父 Activity 类中,重写 onActivityResult()方法,甚至在 Fragment 类中重写它,并调用以下代码。

在父类中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
}

在子类中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // In fragment class callback
}