在 Android 中以编程方式更改 ImageView 的图像

Posted

技术标签:

【中文标题】在 Android 中以编程方式更改 ImageView 的图像【英文标题】:Change Image of ImageView programmatically in Android 【发布时间】:2013-05-30 04:21:41 【问题描述】:

当我以编程方式更改图像时,它会在最初在布局文件中设置的旧图像之上显示新图像?

这是我的布局文件的 sn-p:

<LinearLayout
    android:layout_
    android:layout_
    android:gravity="center_vertical" >
    <ImageView
        android:id="@+id/qStatusImage"
        android:layout_
        android:layout_
        android:layout_margin="5dp"
        android:background="@drawable/thumbs_down"
         />

    <TextView
        android:id="@+id/grp_child"
        android:layout_
        android:layout_
        android:textColor="@color/radio_colors"
        android:textStyle="normal"
        android:background="@color/grey"
    />

 </LinearLayout>

以及设置 imageView 的代码:

     @Override
public View getChildView(final int groupPosition, final int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) 
//Answers
            if(answersGroup != null)
                   answersGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() 
                       @Override
                    public void onCheckedChanged(RadioGroup group, int checkedId) 

                         //  int index = answersGroup.indexOfChild(findViewById(answersGroup.getCheckedRadioButtonId()));

                           qImageView = (ImageView) V.findViewById(R.id.qStatusImage);
                           if(ans ==0 || ans == 5)
                            //   qSV.setImageResource(0);
                               qImageView.setImageResource(R.drawable.thumbs_up);
                           
                           else
                               qImageView.setImageResource(R.drawable.thumbs_down);

                       
                   );

我错过了什么?

【问题讨论】:

【参考方案1】:

如果上述解决方案不起作用,只需从 XML 中删除这一整行

android:src="@drawable/image"

&只尝试

imageView.setBackgroundResource(R.drawable.image);

【讨论】:

【参考方案2】:

你可以使用

val drawableCompat = ContextCompat.getDrawable(context, R.drawable.ic_emoticon_happy)

或者在java中java

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)

【讨论】:

【参考方案3】:

在 XML 设计中

android:background="@drawable/imagename 
android:src="@drawable/imagename"

通过代码绘制的图像

imageview.setImageResource(R.drawable.imagename);

服务器映像

  ## Dependency ##

  implementation 'com.github.bumptech.glide:glide:4.7.1'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'

  Glide.with(context).load(url) .placeholder(R.drawable.image)
   .into(imageView);

 ## dependency  ##
 implementation 'com.squareup.picasso:picasso:2.71828'

 Picasso.with(context).load(url) .placeholder(R.drawable.image)
 .into(imageView);

【讨论】:

【参考方案4】:

简答

只需将图像复制到您的res/drawable 文件夹并使用

imageView.setImageResource(R.drawable.my_image);

详情

答案的多样性可能会引起一些混乱。我们有

setBackgroundResource() setBackgroundDrawable() setBackground() setImageResource() setImageDrawable() setImageBitmap()

名称中带有Background 的方法都属于View 类,而不是具体属于ImageView。但由于ImageView 继承自View,您也可以使用它们。名称中带有Image 的方法专门属于ImageView

View 方法都做同样的事情(尽管setBackgroundDrawable() 已被弃用),所以我们只关注setBackgroundResource()。同样,ImageView 方法都做同样的事情,所以我们只关注setImageResource()。方法之间的唯一区别是它们传入的参数类型。

设置

这是一个包含ImageViewFrameLayoutImageView 最初没有任何图像。 (我只添加了FrameLayout,这样我就可以在它周围加上一个边框。这样你就可以看到ImageView 的边缘。)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_
        android:layout_
        android:background="@drawable/border"
        android:layout_centerInParent="true">

        <ImageView
            android:id="@+id/imageView"
            android:layout_
            android:layout_/>

    </FrameLayout>
</RelativeLayout>

下面我们将比较不同的方法。

setImageResource()

如果您使用 ImageView 的 setImageResource(),则图像会保持其纵横比并调整大小以适合。这是两个不同的图像示例。

imageView.setImageResource(R.drawable.sky); imageView.setImageResource(R.drawable.balloons);

setBackgroundResource()

另一方面,使用 View 的 setBackgroundResource() 会导致图像资源被拉伸以填充视图。

imageView.setBackgroundResource(R.drawable.sky); imageView.setBackgroundResource(R.drawable.balloons);

两者

View的背景图片和ImageView的图片是分开绘制的,可以同时设置。

imageView.setBackgroundResource(R.drawable.sky);
imageView.setImageResource(R.drawable.balloons);

【讨论】:

注意以下关于setImageResourceSets a drawable as the content of this ImageView. This does Bitmap reading and decoding on the UI thread, which can cause a latency hiccup. If that's a concern, consider using setImageDrawable(Drawable) or setImageBitmap(Bitmap) and android.graphics.BitmapFactory instead. 很好的解释@Suragch【参考方案5】:
qImageView.setImageResource(R.drawable.img2);

我想这会对你有所帮助

【讨论】:

【参考方案6】:

在 XML 中使用:

android:src="@drawable/image"

来源使用:

imageView.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.your_image));

【讨论】:

【参考方案7】:

这是因为您设置了 ImageView 的 src 而不是背景。

改用这个:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Here 的帖子讨论了这两种方法之间的区别。

【讨论】:

这在 API 14 中不起作用。应该使用:image.setImageResource(R.drawable.icon_dot1); @Brave 的回答是正确的。使用setBackgroundResource() :( 在使用新图像之前没有删除现有图像.. 所以我有两个图像在那里碰撞。setImageResource() 工作寿 :)。仍然 .. 这篇文章让我走上了正轨——感谢您的两个回答! 正如@mricyicy 的回答所说,问题在于 xml 正在定义背景图像,而代码正在更改资源图像。那些不一样。设置资源图像是这里实际需要的,所以xml应该是固定的。 为什么不setImageResource @VioletGiraffe ImageView.setImageResource(R.drawable.image); 为我工作【参考方案8】:

在图像视图的 XML 中,您有 android:background="@drawable/thumbs_down 把它改成android:src="@drawable/thumbs_down"

目前它将该图像作为视图的背景,而不是其中的实际图像。

【讨论】:

以上是关于在 Android 中以编程方式更改 ImageView 的图像的主要内容,如果未能解决你的问题,请参考以下文章

在recyclerview android中以编程方式更改布局管理器

如何在 Android 中以编程方式更改应用程序图标?

如何在android中以编程方式更改文件/文件夹权限

如何在 Android 2016 中以编程方式更改应用程序图标

xml 如何在Android中以编程方式更改应用程序图标

在 Android 11 (API 30) 中以编程方式更改状态栏文本颜色