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.