【问题标题】:How to clear an ImageView in Android?如何在 Android 中清除 ImageView?
【发布时间】:2011-02-20 23:59:49
【问题描述】:

我将ImageViews 重复用于我的显示器,但在某些时候我没有价值来表达它。

那么如何在Android中清除ImageView呢?

我试过了:

mPhotoView.invalidate();
mPhotoView.setImageBitmap(null);

他们都没有清除视图,它仍然显示以前的图像。

【问题讨论】:

  • 我建议在你没有值的时候加载默认图片。
  • 我没有默认图片,只有背景。我只需要背景。
  • 我认为接受的答案需要在这里更改。 stackoverflow 上是否有任何规定可以将接受的答案从“解决方法”答案更改/移动为实际答案(或更好的答案)?因为很多用户(比如我)可以接受而不是更好的答案
  • @ShirishHerwade 好的已更改
  • 我遇到了同样的问题,我这样做:stackoverflow.com/a/50448536/5697474

标签: android android-imageview android-resources android-image


【解决方案1】:

我曾经使用dennis.sheppard 解决方案:

viewToUse.setImageResource(0);

它有效,但没有记录,因此不清楚它是否会影响视图中的其他内容(如果您愿意,可以查看ImageView code,我没有)。

我认为最好的解决方案是:

viewToUse.setImageResource(android.R.color.transparent);

我最喜欢这个解决方案,因为恢复状态没有什么棘手的问题,而且它在做什么也很清楚。

【讨论】:

  • 我认为使用带有颜色标识符的 setImageResource 会给你在 Android 2.2.1 上带来崩溃问题
  • 对我来说工作 viewToUse.setImageResource(android.R.color.transparent);代码
  • 请注意这一点,如果您实际上有一个 id 为 0 的资源,这实际上会将该可绘制对象设置为您的图像视图。不确定将其作为 id 的可能性有多大..
  • 我遇到了 setImageResource(0) 的问题——并不总是有效。但是将其设置为透明是非常可靠的。谢谢!
  • viewToUse.setImageResource(0); 不起作用,但 viewToUse.setImageResource(android.R.color.transparent); 起作用了。
【解决方案2】:

我有一个类似的问题,我需要从屏幕上完全删除 ImageViews。这里的一些答案使我朝着正确的方向前进,但最终调用 setImageDrawable() 对我有用:

imgView.setImageDrawable(null);

(正如评论中提到的,这种用法记录在官方文档中:ImageView#setImageDrawable。)

【讨论】:

  • 这至少在我的应用程序中可靠地工作。 setImageResource(0) 有时有效,但有时无效。
  • 如果您使用 setImageBitmap 设置图像,这就是您想要的
  • 我认为这是最好的答案!它干净、有效且非常简短。无需定义空白可绘制对象并应用它或类似的东西。
  • 这个答案实际上很可靠!这是最早将这段代码作为解决方案的帖子。因此,我赞成这篇文章,而不是其他答案相同的帖子。
  • 这个答案实际上记录在官方文档中:developer.android.com/reference/android/widget/…
【解决方案3】:

我知道这是旧的,但我能够做到这一点

viewToUse.setImageResource(0);

好像不应该,但我一时兴起试了一下,效果很好。

【讨论】:

  • 实际上,将其设置为任何无效的图像资源都有效(-1、45 等)
  • 不,设置为 -1 会给你 android.content.res.Resources$NotFoundException。 0 似乎有效。
  • 这种情况下,当您滚动列表视图时。以某种方式将其设置为 0 的图像视图将显示错误的图像(它将显示来自另一个图像视图的图像),因此下面的分辨率可以做到 viewToUse.setImageResource(android.R.color.transparent);
  • 我在尝试此方法时遇到过一次此错误:“android.content.res.Resources$NotFoundException: Resource ID #0x0”,因此设置空图像似乎是“清除" ImageView
【解决方案4】:

听起来您想要的是默认图像,以便在 ImageView 不显示其他图像时将其设置为。 Contacts 应用程序就是这样做的:

if (photoId == 0) {
    viewToUse.setImageResource(R.drawable.ic_contact_list_picture);
} else {
    // ... here is where they set an actual image ...
}

【讨论】:

  • 不,我不想要这个。我只想清除内容。之后用户可以选择新的图像。
  • 通讯录应用是开源的 (android.git.kernel.org/?p=platform/packages/apps/…)。我调查了源代码。事实证明,他们使用的是 QuickContactBadge(ImageView 的子类),当他们没有照片时,他们使用 setImageResource 设置默认图像。查看 com.android.contacts.ContactsListActivity#ContactItemListAdapter 了解详细信息,尤其是在 getView() 中。
  • 如果它不是你想要的,为什么你会检查那个答案是正确的?
  • Daniel 人们希望图像清晰的原因可能有很多。
  • 他不想要默认图像。他希望它被清除。
【解决方案5】:

我尝试这样做是为了清除 ImageView 中的 Image 和 DrawableCache

ImgView.setImageBitmap(null);
ImgView.destroyDrawingCache();

我希望这对你有用!

【讨论】:

    【解决方案6】:

    如果这些解决方案都没有清除您已设置的图像(尤其是 setImageResource(0)setImageResources(android.R.color.transparent),请检查以确保当前图像未使用 setBackgroundDrawable(...) 或类似的东西设置为背景。

    您的代码只会将前景中的图像资源设置为在您设置的背景图像前面透明的东西,并且仍然会显示。

    【讨论】:

      【解决方案7】:

      如果你使用 glide,你可以这样做。

      Glide.with(yourImageView).clear(yourImageView)
      

      【讨论】:

      • 感谢 refig,它有很大帮助。
      • 我觉得第一个yourImageView应该是context
      • 没有区别,glide 从 imageView 获取上下文
      【解决方案8】:

      嘿,我知道我回答这个问题已经很晚了,但我只是想我必须分享这个,

      重置图像时调用的方法必须与设置图像时调用的方法相同。

      当您想重置 图像源 @dennis.sheepard 时,只有当您最初使用 setImageResource() 在位图中设置图像时,答案才能正常工作

      例如,

      我使用了setImageBitmap(),因此设置setImageResource(0) 不起作用,我使用了setImageBitmap(null)

      【讨论】:

      • 你说得对,Ajay,我也观察到了。根据条件,我交替使用 setImageBitmap()/setImageResource() 来获取相同的图像视图。因此我不得不使用 setImageResource(0)/setImageBitmap(null) alternativley 来清除 imageview。谢谢!
      【解决方案9】:

      我能够通过定义一个可绘制的(类似于blank_white_shape.xml)来实现这一点:

      <shape xmlns:android="http://schemas.android.com/apk/res/android"       
             android:shape="rectangle">
          <solid android:color="@android:color/white"/>
      </shape>
      

      然后,当我想清除图像视图时,我只需调用

       imageView.setImage(R.drawable.blank_white_shape);
      

      这对我来说效果很好!

      【讨论】:

        【解决方案10】:

        对于 ListView 项目图像,您可以在列表适配器中为“无图像”情况设置 ImageView.setVisibility(View.INVISIBLE)ImageView.setImageBitmap(null)

        【讨论】:

          【解决方案11】:

          正如kwasi 写的和golu 编辑的那样,您可以使用透明而不是白色:

          文件drawable/transparent.xml

          <?xml version="1.0" encoding="utf-8"?>
          <shape xmlns:android="http://schemas.android.com/apk/res/android" >
              <solid android:color="@android:color/transparent"/>
          </shape>
          

          在活动、视图等内部:

          view.setImageResource(R.drawable.transparent);
          

          【讨论】:

            【解决方案12】:

            这对我有用。

            emoji.setBackground(null);
            

            这会在运行时崩溃。

            viewToUse.setImageResource(android.R.color.transparent);  
            

            【讨论】:

              【解决方案13】:

              要删除 ImageView 中的图像,请使用:

              title_image.setImageResource(-1);

              它对我有用

              【讨论】:

                【解决方案14】:

                如果你使用支持库,你会得到 AppCompatImageView 而不是 ImageView ,它在所有设备上都支持 setImageResource(0),所以你应该像使用 setImageDrawable(null)setImageBitmap(null) 一样使用它

                否则,从某些 Android 版本开始,它应该可以正常工作。根据Android的代码和我的测试,我认为使用Android API 22(5.1)中的setImageResource(0)应该是安全的。可以查看API 22 vs API 21的Android代码,here

                【讨论】:

                  【解决方案15】:

                  我遇到了同样的问题,我将视图的背景颜色更改为布局背景颜色,你可以这样做:

                   edit_countflag.setBackgroundColor(Color.parseColor("#ffffff"));
                  

                  //然后设置图片

                  edit_countflag.setImageResource(R.drawable.flag_id);
                  

                  【讨论】:

                    【解决方案16】:

                    我也尝试使用ImageView.setImageRessource(0) 删除 ImageView 的图像,但它对我不起作用。
                    幸运的是,我在日志中收到了这条消息:

                    Caused by: java.lang.IllegalStateException: The specified child already has a parent. 
                    You must call removeView() on the child's parent first.
                    

                    假设layoutmanager 是您的布局实例,而不是您需要这样做:

                    RelativeLayout layoutManager = new RelativeLayout(this);
                    ImageView image = new ImageView(this);
                    
                    // this line worked for me
                    layoutManager.removeView(image);
                    

                    【讨论】:

                      【解决方案17】:

                      我能否指出你们都在尝试设置什么,并指出它期望可绘制对象的位置。

                      你不应该做以下事情吗?

                      imageview.setImageDrawable(this.getResources().getDrawable(R.drawable.icon_image));
                      
                      imageview.setImageDrawable(getApplicationContext().getResources().getDrawable(R.drawable.icon_profile_image));
                      

                      【讨论】:

                        【解决方案18】:

                        editText.setText("");

                        imageView.setImageResource(0);

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2018-01-24
                          • 1970-01-01
                          • 2013-08-06
                          • 2021-05-15
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多