如何检查 ImageView 是不是包含位图?

Posted

技术标签:

【中文标题】如何检查 ImageView 是不是包含位图?【英文标题】:How to check if ImageView contains Bitmap or not?如何检查 ImageView 是否包含位图? 【发布时间】:2013-12-17 21:50:53 【问题描述】:

我正在实现如果ImageView 有位图,那么它应该将图像从 imageview 保存到内部存储器,否则在应用程序的内部存储器中设置另一个位图。 这是代码:_

 croppedImage = cropImageView.getCroppedImage();
                 croppedImageView = (ImageView) findViewById(R.id.croppedImageView);
                croppedImageView.setImageBitmap(croppedImage);@Override
    public void onClick(View v) 
        // TODO Auto-generated method stub
        switch (v.getId()) 
        case R.id.btn_save:
            counter++;
            if(croppedImageView.getDrawable() != null)
            
                System.out.println("nullllllllllllll");

                try 
                    Bitmap photo = ((BitmapDrawable)croppedImageView.getDrawable()).getBitmap();
                    FileOutputStream mFileOutStream1 = openFileOutput("IMG" + counter + ".png", Context.MODE_PRIVATE);
                    photo.compress(CompressFormat.JPEG, 100, mFileOutStream1); 
                catch (FileNotFoundException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                else
                  System.out.println("notttttnullllllllllllll");
                  try 
                     FileOutputStream mFileOutStream1 = openFileOutput("IMG" + counter + ".png", Context.MODE_PRIVATE);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, mFileOutStream1);
                   catch (FileNotFoundException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                  

                
Editor editor = def.edit();
            editor.putInt("value", counter);
            editor.commit();
    break;

        default:
            break;
    
    

【问题讨论】:

【参考方案1】:

您可以如下检查:

boolean hasDrawable = (croppedImageView.getDrawable() != null);
if(hasDrawable) 
    // imageView has image in it

else 
    // no image assigned to image view

只检查位图值如下:

if(bitmap == null) 
    // set the toast for select image
 else 
    uploadImageToServer();

【讨论】:

boolean hasDrawable = (croppedImageView.getDrawable() != null); if(hasDrawable) System.out.println("drawableeeeee "+hasDrawable); else System.out.println("drawableeeeee"+hasDrawable);我实现了这段代码来检查,但它也没有给出任何响应。 你说的“没有给出任何回应”是什么意思?你看到System.out.println 的其他输出了吗?见***.com/q/2220547/827110 不,它不打印任何东西。 请使用Log.d 将输出记录到logcat 或使用调试器进行验证。也可以点击我在评论中发布的链接并阅读。【参考方案2】:

accepted answer 不正确至少在一种情况下:当您之前将 ImageViews Bitmap 设置为 null 时,通过:

imageView.setImageBitmap(null);

实际上它不会将内部Drawable 设置为null。所以,在接受的答案检查中提出的建议会给你不正确的结果。

您可以在ImageViewsource code 中轻松了解发生了什么:

 public void setImageBitmap(Bitmap bm) 
     // if this is used frequently, may handle bitmaps explicitly
     // to reduce the intermediate drawable object
     setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
 

意味着不是将其内部Drawable 设置为null,而是将其设置为新创建的BitmapDrawablenull Bitmap

因此,检查ImageView 是否具有某种意义的Drawable 的正确方法如下:

publie static boolean hasNullOrEmptyDrawable(ImageView iv)

    Drawable drawable = iv.getDrawable();
    BitmapDrawable bitmapDrawable = drawable instanceof BitmapDrawable ? (BitmapDrawable)drawable : null;

    return bitmapDrawable == null || bitmapDrawable.getBitmap() == null;

此外,查看源代码中的这种行为,您可能会认为null Drawbleandroid SDK 开发人员试图避免的事情。这就是为什么您应该完全避免依赖getDrawable() == null 签入您的代码。

【讨论】:

以上是关于如何检查 ImageView 是不是包含位图?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何将整个 ImageView 转换为位图?

如何清理或刷新 ImageView 位图画布?

如何使用复合可绘制对象而不是包含 ImageView 和 TextView 的 LinearLayout

将 ImageView 转换为具有本机分辨率的位图

如何像imageview一样裁剪位图中心? [复制]

保存 Android ImageView 位图