Thay đổi hình ảnh của ImageView theo lập trình trong Android


114

Khi tôi thay đổi hình ảnh theo chương trình, nó sẽ hiển thị hình ảnh mới ở trên hình ảnh cũ được đặt ban đầu trong tệp bố cục?

Đây là một đoạn mã của tệp bố cục của tôi:

<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>

Và mã đặt 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);

                       }
                   });

Tôi đang thiếu gì?

Câu trả lời:


179

Điều đó xảy ra vì bạn đang đặt src ImageViewthay vì background.

Sử dụng cái này thay thế:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Đây là một chủ đề nói về sự khác biệt giữa hai phương pháp.


34
Điều này không hoạt động trong API 14. Nên sử dụng:image.setImageResource(R.drawable.icon_dot1);
Brave

2
Câu trả lời của @ Brave là đúng. Sử dụng setBackgroundResource():( đã không loại bỏ hình ảnh hiện có trước khi sử dụng hình ảnh mới .. vì vậy tôi có hai hình ảnh va chạm ở đó. setImageResource()Làm việc tho :). Tuy nhiên .. bài viết đã giúp tôi đi đúng hướng - cảm ơn tôi cho cả hai câu trả lời!
Gene Bo

Như câu trả lời của @mricyicy đã nói, vấn đề là xml đang xác định hình ảnh nền và mã đang thay đổi hình ảnh tài nguyên. Những cái đó không giống nhau. Đặt hình ảnh tài nguyên là những gì thực sự mong muốn ở đây, vì vậy xml nên được sửa.
Martin Epsz

3
Tại sao không setImageResource?
Violet Giraffe,

4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);đã làm việc cho tôi
jonasxd360

80

Sử dụng trong XML:

android:src="@drawable/image"

Nguồn sử dụng:

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

47

Câu trả lời ngắn

Chỉ cần sao chép một hình ảnh vào res/drawablethư mục của bạn và sử dụng

imageView.setImageResource(R.drawable.my_image);

Chi tiết

Sự đa dạng của các câu trả lời có thể gây ra một chút nhầm lẫn. Chúng ta có

Các phương thức có Backgroundtên của chúng đều thuộc về Viewlớp, không thuộc về lớp ImageViewcụ thể. Nhưng vì ImageViewkế thừa từ Viewbạn cũng có thể sử dụng chúng. Các phương thức có Imagetrong tên của họ cụ thể thuộc về ImageView.

Tất Viewcả các phương thức đều hoạt động giống nhau (mặc dù setBackgroundDrawable()không được dùng nữa), vì vậy chúng tôi sẽ chỉ tập trung vào setBackgroundResource(). Tương tự, ImageViewtất cả các phương pháp đều làm điều tương tự, vì vậy chúng ta sẽ chỉ tập trung vào setImageResource(). Sự khác biệt duy nhất giữa các phương thức là kiểu tham số bạn truyền vào.

Thiết lập

Đây là một FrameLayoutchứa một ImageView. Các ImageViewban đầu không có bất kỳ hình ảnh trong đó. (Tôi chỉ thêm cái FrameLayoutđể tôi có thể đặt một đường viền xung quanh nó. Bằng cách đó, bạn có thể nhìn thấy cạnh của ImageView.)

nhập mô tả hình ảnh ở đây

<?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>

Dưới đây chúng tôi sẽ so sánh các phương pháp khác nhau.

setImageResource ()

Nếu bạn sử dụng ImageView setImageResource(), thì hình ảnh sẽ giữ nguyên tỷ lệ khung hình và được thay đổi kích thước để phù hợp. Đây là hai ví dụ hình ảnh khác nhau.

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

nhập mô tả hình ảnh ở đây

setBackgroundResource ()

setBackgroundResource()Mặt khác, sử dụng View làm cho tài nguyên hình ảnh bị kéo căng để lấp đầy khung nhìn.

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

nhập mô tả hình ảnh ở đây

Cả hai

Hình nền của Chế độ xem và hình ảnh của ImageView được vẽ riêng biệt, vì vậy bạn có thể đặt cả hai.

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

nhập mô tả hình ảnh ở đây


1
lưu ý những điều sau về setImageResource:Sets 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.
William Reed

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

Tôi nghĩ điều này sẽ giúp bạn


13

Trong XML của bạn cho chế độ xem hình ảnh, nơi bạn đã android:background="@drawable/thumbs_down thay đổi điều này thànhandroid:src="@drawable/thumbs_down"

Hiện tại nó đang đặt hình ảnh đó làm nền cho chế độ xem chứ không phải hình ảnh thực tế trong đó.


10

Trong thiết kế XML

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

Hình ảnh có thể vẽ qua mã

imageview.setImageResource(R.drawable.imagename);

Hình ảnh máy chủ

  ## 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

Bạn có thể dùng

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

hoặc trong java java

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.