在NestedFragment(View Pager)中调用onActivityResult

时间:2016-01-31 19:33:25

标签: android android-fragments

我在我的Activity中包含的一个视图寻呼机标签(片段)中有一个ImageView。我正在尝试从库中加载图像,但似乎onActivityResult被称为父活动。我搜索并尝试了很多解决方案,但没有一个有效。最接近的方法是写下这个:

在家长活动中:

 @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) {
    super.onActivityResult(requestCode, resultCode, data);

    List<Fragment> fragments = getChildFragmentManager().getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}

在儿童片段中:

Intent intent = new Intent(Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                getParentFragment().startActivityForResult(Intent.createChooser(intent, "Select Picture"), LOAD_IMAGE_GALLARY);





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

    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == LOAD_IMAGE_GALLARY) {


            if (data != null) {

                picUri = data.getData();
                CropImage();
            }
        } else if (requestCode == CROP_IMAGE) {


            if (data != null) {
                // get the returned data
                Bundle extras = data.getExtras();

                // get the cropped bitmap
                photo = extras.getParcelable("data");
                flat_photo.setImageBitmap(photo);

                if (pic != null) {
                    // To delete original image taken by camera
                    if (pic.delete()) {


                    }

                }
            }
        }
    }
}


protected void CropImage() {
    try {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(picUri, "image/*");

        intent.putExtra("crop", "true");
        intent.putExtra("outputX", 400);
        intent.putExtra("outputY", 300);
        intent.putExtra("aspectX", 4);
        intent.putExtra("aspectY", 3);
        intent.putExtra("scaleUpIfNeeded", true);
        intent.putExtra("return-data", true);


        getParentFragment().startActivityForResult(intent, CROP_IMAGE);


    } catch (ActivityNotFoundException e) {
        Toast.makeText(getContext(),
                "Sorry, your device don't support cropping.",
                Toast.LENGTH_SHORT).show();

    }
}

此代码中发生的情况是,当我完成裁剪并按下提交时出现裁剪窗口,它再次出现,然后按下提交完成活动。简而言之,它不起作用。

有几个用户发布了数百个解决方案。请尝试写一个工作的。非常感谢。

2 个答案:

答案 0 :(得分:1)

onActivityResult()将始终在Activity中调用。它永远不会返回片段中的结果。您可以做的是,一旦您在活动中获得结果,您就可以将结果传递给您在问题本身中发布的片段。

fragment.onActivityResult(requestCode, resultCode, data);

其中fragment是要传递结果的Fragment的实例。

答案 1 :(得分:1)

使用ViewPager的父级活动:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

在ViewPager的子片段中:

@OnClick(R.id.fabNav)
public void showComposePost(View v) {
    Intent intent = new Intent(getActivity(), ComposeActivity.class);
    /*[...]*/
    getActivity().startActivityForResult(intent,1888);
}

在同一个子片段中:

@override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "reqCode: " + requestCode);
    Log.d(TAG, "resultCode: " + resultCode);
    if (resultCode == Activity.RESULT_OK && requestCode == 1888) {
        getList();
    }
}