在DialogFragment中未执行onActivityResult()方法

11

我已经浏览了成千上万篇文章,但是我没有找到解决我的问题的方法。

我有一个 ImageView。当用户点击此 ImageView 时,会显示一个 DialogFragment,用户可以选择使用相机拍摄新照片或从图库中选择照片。到这里一切正常。

问题在于,用户选择的图片应该替换 ImageView 中的当前图片,但这一部分不起作用,因为执行此代码的 onActivityResult() 函数未被执行,因此 ImageView 中的图像始终保持不变。我将感激任何帮助,因为我看不到或理解为什么此代码未被执行。

用户选择图像后,LogCat 中会出现警告:

05-07 12:17:11.542: I/ActivityManager(59): Displayed activity com.android.gallery/com.android.camera.ImageGallery: 935 ms (total 935 ms)

05-07 12:17:12.812: W/FragmentActivity(3614): Activity result no fragment exists for index: 0x10001

05-07 12:17:12.862: W/InputManagerService(59): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@45fd9c38 (uid=10016 pid=317)

Activity.java:

private ImageView imageLoader = null;
imageLoader = (ImageView) findViewById(R.id.f_imageLoader);        
imageLoader.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        ImageLoaderDialog imageLoaderDialog = new ImageLoaderDialog(imageLoader);
        imageLoaderDialog.show(getSupportFragmentManager(), "imageLoaderDialog");
}

活动.xml:

<ImageView
    android:id="@+id/f_imageLoader"
android:layout_width="wrap_content"
    android:layout_height="0dip"
    android:layout_weight="0.20"
android:contentDescription="@string/imgDesc"
    android:src="@drawable/my_image" />

ImageLoaderDialog.java:

//Dialog for choosing between new camera image or gallery image.
public class ImageLoaderDialog extends android.support.v4.app.DialogFragment {
    private ImageView targetImageView = null;
    final int TAKE_PICTURE = 0;
    final int PICK_PHOTO = 1;

    public ImageLoaderDialog (View view) {
        targetImageView = (ImageView) view;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Selecciona");
        final String[] imageSources = getResources().getStringArray(R.array.imageSources);
        builder.setItems(imageSources, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                switch(item) {
                    case TAKE_PICTURE:
                        Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(takePicture, TAKE_PICTURE);
                        break;
                    case PICK_PHOTO:
                        Intent pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        startActivityForResult(pickPhoto, PICK_PHOTO);
                        break;
                }
            }
        });
        return builder.create();
    }

//Set image to user's selected image.
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    if (resultCode == android.app.Activity.RESULT_OK) {
        Uri selectedImage = intent.getData();
        Log.i("IMAGEN", ""+selectedImage);
        targetImageView.setImageURI(selectedImage);
    }  
}
}

任何帮助都将不胜感激。

1个回答

1

主机活动覆盖了onActivityResult但没有对未处理的结果代码调用super.onActivityResult。 显然,尽管片段发出了startActivityForResult调用,但活动首先处理结果。 当考虑到片段的模块化时,这是有道理的。 一旦我为所有未处理的结果实现了super.onActivityResult,片段就有机会处理结果。试试这个:

getActivity().onActivityResult(requestCode, resultCode, intent);

在Android 4.4.2上,这似乎不再是真的了。如果片段调用自己的startActivityForResult(...),则不会调用活动的onActivityResult(...)。如果片段调用getActivity()。startActivityForResult(...),则会调用它。 - Kevin Krumwiede

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接