安卓 - 无法将相册图片设置为ImageView

3

我看了很多帖子,但仍然无法弄清楚为什么无法让它正常工作。 我只想让用户点击一个按钮打开画廊应用程序。 然后用户选择一张图片,自动关闭画廊并返回到我的应用程序,自动将该图像设置为ImageView。

到目前为止,我已经做到了让它一直工作,直到返回到我的应用程序。 它似乎都很好,但图像从未出现在ImageView中。

这是ImageView的XML代码:

<ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="14dp"
        android:layout_gravity="center_horizontal" />

在我开始活动时,我使用以下代码设置了ImageView:

 ImageView targetImage;

以下是我获取图像并将其设置到ImageView的代码,还有一个按钮可以启动“setGunImage”。

public void setGunImage(View view) {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            targetImage = (ImageView)findViewById(R.id.imageView1);
            Uri selectedImageUri = data.getData();
            targetImage.setImageURI(selectedImageUri);
        }
    }
}

我已经在启用sd卡并加载图像的模拟器上以及在真实设备上进行了测试。两者都表现出相同的行为。它可以很好地完成图库步骤,但当返回到我的应用程序时,ImageView中没有加载任何图像。
我尝试将数据更改为位图并设置它,但它也从未显示出来。我知道这可能是一些非常简单的东西,我只是没有看到,所以希望一个新的眼睛可以指引我正确的方向。谢谢。
2个回答

2

我认为Imran的解决方案应该可以正常工作..............你也可以尝试这种方式

 @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            InputStream stream = null;
         if( resultCode==RESULT_OK)
           {
              if(requestCode==SELECT_PICTURE)
               {
                try {
                    // We need to recyle unused bitmaps
                    if (bitmap != null) {
                        bitmap.recycle();
                    }
                    stream = getContentResolver().openInputStream(data.getData());
                    bitmap = BitmapFactory.decodeStream(stream);

                                targetImage = (ImageView)findViewById(R.id.imageView1);
                    targetImage.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } finally {
                    if (stream != null)
                        try {
                            stream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                }
            super.onActivityResult(requestCode, resultCode, data);
        }

}

来自 链接


哦,在这种情况下,requestCode == REQUEST_CODE 应该改为 requestCode == SELECT_PICTURE... - Dheeresh Singh
在我发布那个问题之后,我意识到了你刚才说的并将代码更改为SELECT_PICTURE。不幸的是,我仍然遇到同样的问题。它可以很好地加载图库,但当我选择一张图片时,它会将我发送回我的应用程序,而ImageView保持空白。我无法弄清楚为什么它无法设置图像。感谢您的帮助。 - dcabal
XML文件中是否有问题,导致图片无法显示?如果我在ImageView中预加载一张图片,它就能正常工作。ImageView位于一个LinearLayout中,该LinearLayout位于一个ScrollView中。 - dcabal
好的,我添加了Toast并且Toast正确显示,所以它肯定已经执行到那一步了。 - dcabal
更新:我将您给我的代码完全复制到一个新的测试项目中,它可以完美地运行,但在我的应用程序中仍然无法正常工作。我真的开始怀疑XML中是否有一些东西搞砸了。虽然不知道是什么,但我会继续寻找。 - dcabal
显示剩余3条评论

1

您正在使用setImageURI传递URI,因此首先使用MediaStore.Images.Media.DATA和URI获取图像的路径,然后将图像的路径传递给setImageURI。 尝试这种方式:

@Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if( resultCode==RESULT_OK)
        {
            if(requestCode==SELECT_PICTURE)
        {
            targetImage = (ImageView)findViewById(R.id.imageView1);
            Uri selectedImageUri = data.getData();
            String selectedImagePath=getPath(selectedImageUri);
            targetImage.setImageURI(selectedImageUri);
            }
        }
    }

    private String getPath(Uri uri)
        {    
        String[] projection={MediaStore.Images.Media.DATA}; 
        Cursor cursor=managedQuery(uri,projection,null,null,null);
        int column_index=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
        cursor.moveToFirst(); 
        return cursor.getString(column_index); 
    }  

1
谢谢您的快速回复,但不幸的是它仍然无法正常工作。它可以加载图库并让我很好地选择图片。选择照片后,它会返回到我的应用程序,但ImageView仍然是空白的。还有其他想法吗? - dcabal

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