当相机活动返回时,承载这个片段的活动有它的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方法中,你可以得到结果。 希望这对你有所帮助。

其他回答

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

还有来自@siqing的回答:

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

添加这个

public void onClick(View v) {   
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, 1);
}

当你将替换你的代码与上述代码,然后自动你的这个

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

方法将开始工作

//No Need to write this code in onclick method
    Intent intent=new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT)
    startActivityForResult(intent,1);
    Toast.makeText(getContext(), "image"+intent, Toast.LENGTH_SHORT).show();

我只是做了一个变通方法:

public static Fragment _tempFragment = null;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(_tempFragment != null)
        _tempFragment.onActivityResult(requestCode, resultCode, data);
}

在Fragment中,在startActivityResult之前,设置

MainActivity._tempFragment = this;

在片段中的onActivityResult <——之后

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

     // Do your job
     {

     }
     MainActivity._tempFragment = null;
}

我在《Fragment》中也遇到了这个问题。我在一个DialogFragment中调用startActivityForResult。

但现在这个问题已经解决了: FragmentClassname.this.startActivityForResult。

You can simply override BaseActivity onActivityResult on fragment baseActivity.startActivityForResult . On BaseActivity add interface and override onActivityResult. private OnBaseActivityResult baseActivityResult; public static final int BASE_RESULT_RCODE = 111; public interface OnBaseActivityResult{ void onBaseActivityResult(int requestCode, int resultCode, Intent data); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){ getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data); setBaseActivityResult(null); } On Fragment implements OnBaseActivityResult @Override public void onBaseActivityResult(int requestCode, int resultCode, Intent data) { Log.d("RQ","OnBaseActivityResult"); if (data != null) { Log.d("RQ","OnBaseActivityResult + Data"); Bundle arguments = data.getExtras(); } }

这个变通方法会奏效。