setImageDrawable을 동적으로 사용하여 ImageView에서 이미지 설정


120

drawable폴더 의 이미지 이름이 같은 데이터베이스에서 문자열을 동적으로 생성하고 있습니다.

이제 동적으로 ImageView사용 하기 위해 해당 값을 설정하고 싶습니다 setImageDrawable(R.id.StringGenerated).

어떤 제안 ..


이미지의 ID를 동적으로 생성하고 있음을 의미합니다.
— Paresh Mayani 2011

답변:


195

이 시도,

int id = getResources().getIdentifier("yourpackagename:drawable/" + StringGenerated, null, null);

이렇게하면 액세스하려는 드로어 블의 ID가 반환됩니다. 그러면 다음을 수행하여 이미지 뷰에서 이미지를 설정할 수 있습니다.

imageview.setImageResource(id);

고마워요 .. 다른 곳에서 찾았습니다. 노력에 감사드립니다 .. :)
— Arun

12
그러나 setImageResource ()를 사용하면 "UI 스레드에서 비트 맵 읽기 및 디코딩이 수행되므로 지연 문제가 발생할 수 있습니다. setImageDrawable () 또는 setImageBitmap () 사용을 고려하십시오." (Android 문서)
— chetto 2010 년

6
다음을 사용하여 ID를 얻을 수도 있습니다. R.drawable.filemane
— Artur

102
Drawable image = ImageOperations(context,ed.toString(),"image.jpg");
            ImageView imgView = new ImageView(context);
            imgView = (ImageView)findViewById(R.id.image1);
            imgView.setImageDrawable(image);

또는

setImageDrawable(getResources().getDrawable(R.drawable.icon));

그는 동일한 이름의 이미지를 사용하여 데이터베이스에서 동적으로 문자열을 생성한다고 말했습니다.
— Paresh Mayani 2011

3
getDrawable (R.drawable.icon)은 더 이상 사용되지 않습니다
— Daryn

getDrawable (R.drawable.icon)을 해결해야하는 사람들은 더 이상 사용되지 않습니다.이 SO 링크
— Codingpan

77

개인적으로 setImageResource()이런 방법을 선호합니다 .

ImageView myImageView = (ImageView)findViewById(R.id.myImage);
myImageView.setImageResource(R.drawable.icon);

1
이것은 getResources () 메서드를 호출 할 컨텍스트가없는 코드의 모든 위치에서 이미지를 변경하고 싶을 수 있기 때문에 이깁니다. 예를 들어 어댑터에서. 이 기능을 위해 생성자를 통해 컨텍스트를 전달할 필요가 없습니다.
— Phatee P

1
청소기. 왜 이것이 선호되는 대답이 아닌지 알 수 없습니다.
— Benjamin Basmaci

@BenjaminBasmaci UI 스레드에서 비트 맵 읽기 및 디코딩을 수행하므로 지연 시간이 발생할 수 있습니다. 이것이 문제가되는 경우 대신 setImageDrawable (android.graphics.drawable.Drawable) 또는 setImageBitmap (android.graphics.Bitmap) 및 BitmapFactory를 사용하는 것이 좋습니다. (Android 문서에서)
— Tayyab Mazhar

25

리소스 드로어 블 이름은 문자열로 저장되지 않으므로 빌드 중에 생성 된 정수 상수로 문자열을 해석해야합니다. Resources클래스를 사용하여 문자열을 해당 정수로 해석 할 수 있습니다 .

Resources res = getResources();
int resourceId = res.getIdentifier(
   generatedString, "drawable", getPackageName() );
imageView.setImageResource( resourceId );

이렇게하면 생성 된 문자열 ImageView이 올바른 이미지를로드하는 데 사용할 수 있는 정수로 해석 됩니다.

또는 ID를 사용하여 Drawable수동으로 로드 한 다음 리소스 ID 대신 해당 드로어 블을 사용하여 이미지를 설정할 수 있습니다.

Drawable drawable = res.getDrawable( resourceId );
imageView.setImageDrawable( drawable );

@Greyson ... 좋은 한 선생님 .. 내가 찾고있는 thatz .. 많이 감사합니다 .. :)
— Arun

13

이 대답은 간단합니다.

Drawable myDrawable = getResources().getDrawable(R.drawable.pic);
imageview.setImageDrawable(myDrawable);

8

이것은 적어도 Android API 15에서 작동합니다.

ImageView = imgv;
Resources res = getResources(); // need this to fetch the drawable
Drawable draw = res.getDrawable( R.drawable.image_name_in_drawable );
imgv.setImageDrawable(draw);

setImageResource ()를 사용할 수 있지만 설명서에는 "UI 스레드에서 비트 맵 읽기 및 디코딩을 수행하므로 지연 시간 문제가 발생할 수 있습니다. setImageDrawable () 또는 setImageBitmap () 사용을 고려하십시오."라고 명시 되어 있습니다. chetto가 말한대로


7

게시 된 모든 답변은 오늘 적용되지 않습니다. 예를 들어, getDrawable ()은 더 이상 사용되지 않습니다. 여기에 업데이트 된 답변이 있습니다. 건배!

ContextCompat.getDrawable(mContext, drawable)

문서화 된 방법에서

public static final android.graphics.drawable.Drawable getDrawable (@NotNull android.content.Context context,
@ android.support.annotation.DrawableRes int id


지원 중단 된 부분을 언급 해 주셔서 감사합니다.
— Karan Sharma

6

이 코드를 사용해 볼 수 있습니다.

ImageView ImgView = (ImageView)findViewById(R.id.ImgView);
ImgView.setImageResource(R.drawable.myicon);

4

Activity가 아닌 클래스에서 이와 같은 Resources 객체를 가져올 수없는 경우 getResources ()에 대한 getContext () 메서드를 추가해야합니다.

ImageView image = (ImageView) v.findViewById(R.id.item_image);
int id = getContext().getResources().getIdentifier(imageName, "drawable", getContext().getPackageName());
image.setImageResource(id);

3

imageView.setImageDrawable(getResources().getDrawable(R.drawable.my_drawable));


2

다음과 같이 사용할 수도 있습니다.

imageView.setImageDrawable(ActivityCompat.getDrawable(getContext(), R.drawable.generatedID));

또는 Picasso 사용 :

Picasso.with(getContext()).load(R.drawable.generatedId).into(imageView);


0

나는 당신과 같은 문제가 있었고 그것을 해결하기 위해 다음을 수행했습니다.

**IMAGEVIEW**.setImageResource(getActivity()
             .getResources()
             .getIdentifier("**IMG**", "drawable", getActivity()
             .getPackageName()));

0

POJO.java 클래스를 생성하고 "생성자, 게터 및 세터 메서드"를 생성합니다.

class POJO{
        public POJO(Drawable proImagePath) {
                setProductImagePath(proImagePath);
        }

        public Drawable getProductImagePath() {
                return productImagePath;
        }

        public void setProductImagePath(Drawable productImagePath) {
                this.productImagePath = productImagePath;
        }
}

그런 다음 이미지 드로어 블 리소스를 통해 어댑터를 CustomAdapter.java로 설정합니다.

    class CustomAdapter extends ArrayAdapter<POJO>{

       private ArrayList<POJO> cartList = new ArrayList<POJO>();
       public MyCartAdapter(Context context, int resource) {
          super(context, resource);
       }

       public MyCartAdapter(Context context, ArrayList<POJO> cartList) {
          super(context, 0, cartList);
          this.context = context;
          this.cartList = cartList;

       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
          /*
          *Here you can setup your layout and references.
          **/
          ImageView productImage = (ImageView) rootView.findViewById(R.id.cart_pro_image);
          productImage.setImageDrawable(POJO.getProductImagePath());
        }
    }

그런 다음 ActivityClass.java를 통해 참조를 전달하십시오.

public class MyCartActivity extends AppCompatActivity{
       POJO pojo;
       CustomAdapter customAdapter;
       ArrayList<POJO> cartList = new ArrayList<POJO>();

       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.your_layout);

          customAdapter = new CustomAdapter(this, cartList);

          pojo = new POJO(getResources().getDrawable(R.drawable.help_green));

    }
}

-3

내 프로젝트의 일부, 모든 것이 작동합니다! )

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final ModelSystemTraining modelSystemTraining = items.get(position);

int icon = context.getResources().getIdentifier(String.valueOf(modelSystemTraining.getItemIcon()), "drawable", context.getPackageName());

        final FragmentViewHolderSystem fragmentViewHolderSystem = (FragmentViewHolderSystem) holder;
        final View itemView = fragmentViewHolderSystem.itemView;
//                Set Icon
fragmentViewHolderSystem.trainingIconImage.setImageResource(icon);
//                Set Title
fragmentViewHolderSystem.title.setText(modelSystemTraining.getItemTitle());
//                Set Desc
fragmentViewHolderSystem.description.setText(modelSystemTraining.getItemDescription());

이 코드가 작동해야하는 이유에 대한 설명을 추가해야합니다. 코드 자체에 주석을 추가 할 수도 있습니다. 현재 형식에서는 해결하기 위해 수행 한 작업을 나머지 커뮤니티가 이해하는 데 도움이되는 설명을 제공하지 않습니다. /질문에 답하세요.
— ishmaelMakitla

-3

btnImg.SetImageDrawable (GetDrawable (Resource.Drawable.button_round_green));

API 23 Android 6.0


-4

앱 실행시 'R'파일을 생성 할 수 없습니다. 사용 if-else또는 사용과 같은 다른 대안을 사용할 수 있습니다.switch-case


이것은 질문과 관련이없는 것 같습니다. 그는 오히려 생성하는 것보다, 이미 존재하는 리소스에 이미지 뷰를 설정하려고처럼 보인다 R다시
— Greyson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.