Dynamisches Verwenden von setImageDrawable zum Festlegen von Bildern in einer ImageView


120

Ich generiere dynamisch einen String aus der Datenbank, der den gleichen Namen wie das Bild im drawableOrdner hat.

Jetzt möchte ich diesen Wert für ImageViewdie setImageDrawable(R.id.StringGenerated)dynamische Verwendung festlegen .

Irgendwelche Vorschläge..


bedeutet, dass Sie die ID des Bildes dynamisch generieren, oder?
Paresh Mayani

Antworten:


195

Versuche dies,

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

Dadurch wird die ID des Zeichens zurückgegeben, auf das Sie zugreifen möchten. Anschließend können Sie das Bild in der Bildansicht wie folgt festlegen

imageview.setImageResource(id);

Vielen Dank. Ich habe es woanders gefunden. Trotzdem danke für deine Bemühungen. :)
Arun

12
Die Verwendung von setImageResource () "führt jedoch das Lesen und Dekodieren von Bitmap im UI-Thread durch, was zu einem Latenz-Schluckauf führen kann. Erwägen Sie die Verwendung von setImageDrawable () oder setImageBitmap ()." (Android-Dokumentation)
Chetto

6
Sie können die ID auch erhalten, indem Sie einfach Folgendes verwenden: 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);

oder

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

Er sagte, er generiere dynamisch eine Zeichenfolge aus einer Datenbank mit demselben Bildnamen.
Paresh Mayani

3
getDrawable (R.drawable.icon) ist veraltet
Daryn

Für Leute, die lösen müssen, dass getDrawable (R.drawable.icon) veraltet ist, versuchen Sie, diesen SO-Link
Codingpan

76

Ich persönlich bevorzuge diese Methode setImageResource().

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

1
Dieser gewinnt, da Sie möglicherweise das Bild an einer beliebigen Stelle in Ihrem Code ändern möchten, an der Sie keinen Kontext zum Aufrufen der Methode getResources () haben. zB in Adaptern. Keine Notwendigkeit, den Kontext nur für diese Funktion durch den Konstruktor zu leiten.
Phatee P

1
viel sauberer. Ich verstehe nicht, warum dies nicht die bevorzugte Antwort ist.
Benjamin Basmaci

@BenjaminBasmaci Hiermit wird Bitmap im UI-Thread gelesen und dekodiert, was zu einem Latenz-Schluckauf führen kann. Wenn dies ein Problem darstellt, sollten Sie stattdessen setImageDrawable (android.graphics.drawable.Drawable) oder setImageBitmap (android.graphics.Bitmap) und BitmapFactory verwenden. (Aus der Android-Dokumentation)
Tayyab Mazhar

25

Die von der Ressource zu zeichnenden Namen werden nicht als Zeichenfolgen gespeichert, daher müssen Sie die Zeichenfolge in die während des Builds generierte Ganzzahlkonstante auflösen. Sie können die ResourcesKlasse verwenden, um die Zeichenfolge in diese Ganzzahl aufzulösen.

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

Dadurch wird Ihre generierte Zeichenfolge in die Ganzzahl aufgelöst, mit der ImageViewdas richtige Bild geladen werden kann.

Alternativ können Sie die ID verwenden, um das DrawableBild manuell zu laden, und dann das Bild mithilfe dieser Zeichenfunktion anstelle der Ressourcen-ID festlegen.

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

@Greyson ... Netter Herr ... thatz, was ich suche ... Vielen Dank .. :)
Arun

13

So einfach wie diese Antwort:

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

8

Dies funktioniert zumindest in der 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);

Sie könnten setImageResource () verwenden, aber die Dokumentation gibt an, dass "Bitmap im UI-Thread gelesen und dekodiert wird, was zu einem Latenz-Schluckauf führen kann ... erwägen Sie die Verwendung von setImageDrawable () oder setImageBitmap ()." wie von chetto angegeben


7

Alle Antworten gelten heute nicht mehr. Zum Beispiel ist getDrawable () veraltet. Hier ist eine aktualisierte Antwort, Prost!

ContextCompat.getDrawable(mContext, drawable)

Aus dokumentierter Methode

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


Vielen Dank für die Erwähnung eines veralteten Teils.
Karan Sharma

6

Sie können versuchen, diesen Code zu verwenden:

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

4

Wenn Sie ein solches Ressourcenobjekt in einer Klasse, die keine Aktivität ist, nicht abrufen können, müssen Sie beispielsweise die Methode getContext () für getResources () hinzufügen

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

Sie können auch Folgendes verwenden:

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

oder mit Picasso:

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


0

Ich hatte das gleiche Problem wie Sie und habe Folgendes getan, um es zu lösen:

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

0

Erstellen Sie eine POJO.java-Klasse und erstellen Sie "Konstruktor-, Getter- und Setter-Methoden".

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

Richten Sie dann die Adapter über Bildzeichnungsressourcen in CustomAdapter.java ein

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

Übergeben Sie dann die Referenzen über 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

Ein Stück meines Projekts, alles funktioniert! )

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

Sie sollten wirklich eine Erklärung hinzufügen, warum dieser Code funktionieren sollte - Sie können auch Kommentare in den Code selbst einfügen - in seiner aktuellen Form enthält er keine Erklärung, die dem Rest der Community helfen kann, zu verstehen, was Sie zur Lösung getan haben /beantworte die Frage.
ishmaelMakitla

-3

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

API 23 Android 6.0


-4

Die 'R'-Datei kann nicht zur Laufzeit der App generiert werden. Sie können auch andere Alternativen verwenden, z. B. if-elseoderswitch-case


Dies scheint nichts mit der Frage zu tun zu haben. Es scheint, als würde er versuchen, eine Bildansicht auf eine bereits vorhandene Ressource zu setzen, anstatt Rerneut zu generieren
Greyson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.