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

Arun
quelle
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);
König RV
quelle
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));
NikhilReddy
quelle
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);
jlopez
quelle
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
quelle
@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);
Ahmad Arslan
quelle
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

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

portfoliobuilder
quelle
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);
Mersad Nilchy
quelle
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);
Vladimir Salguero
quelle
3

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

lxknvlk
quelle
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);

Ninjahoahong
quelle
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()));
JCDecary
quelle
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));

    }
}
Abdul Gaffar
quelle
-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());
Максим Багрянцев
quelle
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

isaac
quelle
-4

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

Vinod Maurya
quelle
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