Dynamiczne używanie setImageDrawable do ustawiania obrazu w ImageView


120

Generuję dynamicznie ciąg z bazy danych, który ma taką samą nazwę obrazu w drawablefolderze.

Teraz chcę ustawić tę wartość do ImageViewużycia setImageDrawable(R.id.StringGenerated)dynamicznego.

Jakieś sugestie..


oznacza, że ​​identyfikator obrazu jest generowany dynamicznie, prawda?
Paresh Mayani

Odpowiedzi:


195

Spróbuj tego,

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

To zwróci identyfikator elementu do rysowania, do którego chcesz uzyskać dostęp ... następnie możesz ustawić obraz w widoku obrazu, wykonując następujące czynności

imageview.setImageResource(id);

Wielkie dzięki. Znalazłem to gdzie indziej, ale nadal dziękuję za Wasze Wysiłki. :)
Arun

12
Jednak użycie metody setImageResource () "powoduje odczyt i dekodowanie mapy bitowej w wątku interfejsu użytkownika, co może powodować problemy z opóźnieniem ... rozważ użycie metody setImageDrawable () lub setImageBitmap ()." (Dokumentacja na Androida)
chetto

6
Możesz również uzyskać identyfikator, używając po prostu: 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);

lub

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

powiedział, że dynamicznie generuje ciąg z bazy danych o tej samej nazwie obrazu.
Paresh Mayani

3
getDrawable (R.drawable.icon) jest przestarzałe
Daryn,

Dla osób, które muszą rozwiązać problem getDrawable (R.drawable.icon), jest przestarzałe, spróbuj przeczytać ten link SO
Codingpan,

77

Osobiście wolę stosować taką metodę setImageResource().

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

1
ten wygrywa, ponieważ możesz chcieć zmienić obraz z dowolnego miejsca w kodzie, w którym nie masz kontekstu do wywołania metody getResources (). np. w Adaptery. Nie ma potrzeby przekazywania kontekstu przez konstruktor tylko dla tej funkcji.
Phatee P

1
o wiele czystszy. Nie rozumiem, dlaczego nie jest to preferowana odpowiedź.
Benjamin Basmaci

@BenjaminBasmaci Odczytuje i dekoduje mapę bitową w wątku interfejsu użytkownika, co może powodować problemy z opóźnieniem. Jeśli jest to problem, rozważ użycie zamiast tego setImageDrawable (android.graphics.drawable.Drawable) lub setImageBitmap (android.graphics.Bitmap) i BitmapFactory. (Z dokumentacji Androida)
Tayyab Mazhar

25

Nazwy zasobów, które można rysować, nie są przechowywane jako ciągi, więc trzeba będzie przekształcić ciąg na stałą całkowitą wygenerowaną podczas kompilacji. Możesz użyć Resourcesklasy, aby zamienić ciąg na tę liczbę całkowitą.

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

Spowoduje to przekształcenie wygenerowanego ciągu na liczbę całkowitą, którą ImageView może użyć do załadowania odpowiedniego obrazu.

Alternatywnie możesz użyć identyfikatora, aby załadować Drawableręcznie, a następnie ustawić obraz przy użyciu tego elementu do rysowania zamiast identyfikatora zasobu.

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

@Greyson ... Nice one sir..thatz czego szukam .. wielkie dzięki .. :)
Arun

13

Tak prosta jak ta odpowiedź:

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

8

Działa to przynajmniej w 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);

Można użyć metody setImageResource (), ale dokumentacja określa, że „czy bitmapa odczytuje i dekoduje w wątku interfejsu użytkownika, co może powodować problemy z opóźnieniem… rozważ użycie metody setImageDrawable () lub setImageBitmap ()”. jak stwierdził chetto


7

Wszystkie opublikowane odpowiedzi nie mają zastosowania dzisiaj. Na przykład metoda getDrawable () jest przestarzała. Oto zaktualizowana odpowiedź, zdrowie!

ContextCompat.getDrawable(mContext, drawable)

Z udokumentowanej metody

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


Dziękujemy za wzmiankę o wycofanej części.
Karan Sharma

6

Możesz spróbować użyć tego kodu:

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

4

Jeśli nie możesz uzyskać takiego obiektu Resources w klasie, która nie jest działaniem, musisz na przykład dodać metodę getContext () do metody getResources ()

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

Możesz też użyć czegoś takiego:

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

lub używając Picassa:

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


0

Miałem ten sam problem co ty i wykonałem następujące czynności, aby go rozwiązać:

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

0

Skonstruuj klasę POJO.java i utwórz „metody konstruktora, pobierającego i ustawiającego”

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

Następnie skonfiguruj adaptery za pomocą zasobów graficznych do rysowania w pliku 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());
        }
    }

Następnie przekaż odwołania za pośrednictwem 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

kawałek mojego projektu, wszystko działa! )

@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());

Naprawdę powinieneś dodać wyjaśnienie, dlaczego ten kod powinien działać - możesz również dodać komentarze w samym kodzie - w obecnej formie nie dostarcza żadnego wyjaśnienia, które mogłoby pomóc reszcie społeczności zrozumieć, co zrobiłeś, aby rozwiązać /Odpowiedz na pytanie.
ishmaelMakitla

-3

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

API 23 Android 6.0


-4

Pliku „R” nie można wygenerować w czasie wykonywania aplikacji. Możesz użyć innych alternatyw, takich jak użycie if-elselubswitch-case


Wydaje się, że nie ma to związku z pytaniem. Wygląda na to, że próbuje ustawić widok obrazu na już istniejący zasób, zamiast próbować generować Rponownie
Greyson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.