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


114

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

这是我的布局文件的一个片段:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="39dp"
    android:gravity="center_vertical" >
    <ImageView
        android:id="@+id/qStatusImage"
        android:layout_width="16dp"
        android:layout_height="16dp"
        android:layout_margin="5dp"
        android:background="@drawable/thumbs_down"
         />

    <TextView
        android:id="@+id/grp_child"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        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);

                       }
                   });

我想念什么?

Answers:


179

发生这种情况是因为您设置的是src ImageView而不是背景。

使用此代替:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

是一个讨论两种方法之间差异的线程。


34
这在API 14中不起作用。应使用:image.setImageResource(R.drawable.icon_dot1);
Brave

2
@勇敢的答案是正确的。使用setBackgroundResource():(并没有在使用新图像之前删除现有图像..因此,我在其中碰撞了两个图像 setImageResource()。仍然..帖子使我走上正轨-感谢您的回答!
Gene Bo

就像@mricyicy的回答所说,问题在于xml定义了背景图像,而代码正在更改资源图像。那些不一样。在这里实际需要设置资源映像,因此应该修复xml。
马丁·埃普斯

3
为什么不setImageResource呢?
紫罗兰色长颈鹿

4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);为我工作
jonasxd360

80

在XML中使用:

android:src="@drawable/image"

来源使用:

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

47

简短答案

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

imageView.setImageResource(R.drawable.my_image);

细节

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

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

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

建立

这是一个FrameLayout包含的ImageView。在ImageView最初没有任何图像在里面。(我仅添加,FrameLayout以便可以在其周围放置边框。这样,您就可以看到的边缘ImageView。)

在此处输入图片说明

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

    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:background="@drawable/border"
        android:layout_centerInParent="true">

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </FrameLayout>
</RelativeLayout>

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

setImageResource()

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

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

在此处输入图片说明

setBackgroundResource()

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

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

在此处输入图片说明

View的背景图像和ImageView的图像是分别绘制的,因此可以同时设置它们。

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

在此处输入图片说明


1
请注意以下内容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.
威廉·里德

27
qImageView.setImageResource(R.drawable.img2);

我想这对你有帮助


13

在图像视图的XML中,将其android:background="@drawable/thumbs_down 更改为android:src="@drawable/thumbs_down"

当前,它将图像放置为视图的背景,而不是其中的实际图像。


10

在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);

0

您可以使用

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

或在Java中

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.