existe-t-il un moyen de trouver l'Id de Ressource de drawable

Existe-t-il un moyen d'obtenir l'ID de ressource Drawable? Par exemple, j'utilise un ImageView et je peux d'abord utiliser icon.png comme image, mais plus tard, je peux changer l'image en icon2.png. Je veux savoir en utilisant le code quelle image mon ImageView utilise à partir de la ressource. Est-il de toute façon?

23
demandé sur Yi Jiang 2011-07-07 21:59:37

7 réponses

Essayez-vous de déterminer quelle est l'image actuelle sur le imageview, afin de la changer en une autre image?

Si c'est le cas, je suggère de tout faire en utilisant du code au lieu de xml.

C'est-à-dire utilisez setImageResource() pour définir les imagesinitiales lors de l'initialisation et gardez une trace du resource ids utilisé quelque part dans votre code.

Par exemple, vous pouvez avoir un ensemble de imageviews, avec une matrice de int qui contient les resource id pour chaque imageview

Ensuite, chaque fois que vous voulez changer l'image, faites une boucle dans le tableau et voyez quel est l'id.

6
répondu f20k 2011-07-07 19:05:00

Celui - ci est la meilleure méthode pour trouver le R. drawablw.valeur image1 lorsque vous cliquez sur L'ImageView dans ur prgoram, la méthode est comme ça dans le programme principal tout d'abord enregistrer l'image dans la balise comme ça

public...activity 
{
//-----this vl store the drawable value in Tag of current ImageView,which v vl retriew in //image ontouchlistener event...
ImageView imgview1.setTag(R.drawable.img1);
ImageView imgview2.setTag(R.drawable.img2);

onTouchListnener event...
{

  ImageView imageView = (ImageView) v.findViewById(R.id.imgview1)v;
  Object tag = imageView.getTag();                  
  int id = tag == null ? -1 : Integer.parseInt(tag.toString());
switch(id)
{
case R.drawable.img1:
//do someoperation of ur choice
break;
case R.drawable.img2:
//do someoperation of ur choice
break:
    }//end of switch

 }//end of touch listener event

  }//end of main activity

               "PIR FAHIM SHAH/kpk uet mardan campus"
14
répondu PIR FAHIM SHAH 2012-06-01 15:18:52

Créez un imageview personnalisé, le reste est simple.

public class CustomImageView extends ImageView {

    private int resID;

    public CustomImageView(Context context) {
        super(context);
    }

    public CustomImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setImageResource(int resId) {
        this.resID = resId;
        super.setImageResource(resId);
    }

    public int getResourceId() {
        return resID;
    }
}
5
répondu Bojan Kseneman 2015-05-23 17:09:23

Il y a quelques étapes à suivre:

  1. Créer integer-array xml pour contenir les noms de drawables (ie: "@drawable / icon1"... "@drawable / iconN "

  2. Utilisation getIdentifier ci-dessus pour obtenir le "tableau"

  3. Avec ID pour list of drawable, getStringArray vous donnera un nom de tableau de drawables que vous avez spécifié à l'étape 1.

  4. Ensuite, utilisez à nouveau l'un des noms drawable dans le tableau avec getIdentifier pour obtenir l'ID drawable. Cette utilisation "drawable" au lieu de type "tableau".

  5. Utilisez cet ID pour définir l'image pour votre vue.

J'espère que cela aidera.

0
répondu KITT 2011-11-30 11:49:31

Je maintenant que la question est assez ancienne, mais peut-être que quelqu'un le trouvera utile.

J'ai une liste de TextViews avec Drawables et je veux définir des écouteurs de clic pour tous, sans avoir besoin de changer le code, lorsque la mise en page est modifiée.

J'ai donc mis tous les drawables dans un hashmap pour obtenir leurs identifiants plus tard.

Main_layout.xml

<LinearLayout android:id="@+id/list" >

    <TextView android:drawableLeft="@drawable/d1" />
    <TextView android:drawableLeft="@drawable/d2" />
    <TextView android:drawableLeft="@drawable/d3" />
    <TextView android:drawableLeft="@drawable/d4" />
    <!-- ... -->
</LinearLayout>

Mon activité.java

import java.lang.reflect.Field;
import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable.ConstantState;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MyActivity extends Activity {

    private final HashMap<ConstantState, Integer> drawables = new HashMap<ConstantState, Integer>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main_layout);

        for (int id : getAllResourceIDs(R.drawable.class)) {
            Drawable drawable = getResources().getDrawable(id);
            drawables.put(drawable.getConstantState(), id);
        }

        LinearLayout list = (LinearLayout)findViewById(R.id.list);

        for (int i = 0; i < list.getChildCount(); i++) {

            TextView textView = (TextView)list.getChildAt(i);       
            setListener(textView);

        }
    }

    private void setListener(TextView textView) {

        // Returns drawables for the left, top, right, and bottom borders.
        Drawable[] compoundDrawables = textView.getCompoundDrawables();

        Drawable left = compoundDrawables[0];

        final int id = drawables.get(left.getConstantState());

        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent broadcast = new Intent();

                broadcast.setAction("ACTION_NAME");

                broadcast.putExtra("ACTION_VALUE", id);

                sendBroadcast(broadcast);
            }
        });
    }

    /**
     * Retrieve all IDs of the Resource-Classes
     * (like <code>R.drawable.class</code>) you pass to this function.
     * @param aClass : Class from R.X_X_X, like: <br>
     * <ul>
     * <li><code>R.drawable.class</code></li>
     * <li><code>R.string.class</code></li>
     * <li><code>R.array.class</code></li>
     * <li>and the rest...</li>
     * </ul>
     * @return array of all IDs of the R.xyz.class passed to this function.
     * @throws IllegalArgumentException on bad class passed.
     * <br><br>
     * <b>Example-Call:</b><br>
     * <code>int[] allDrawableIDs = getAllResourceIDs(R.drawable.class);</code><br>
     * or<br>
     * <code>int[] allStringIDs = getAllResourceIDs(R.string.class);</code>
     */
    private int[] getAllResourceIDs(Class<?> aClass) throws IllegalArgumentException {
            /* Get all Fields from the class passed. */
            Field[] IDFields = aClass.getFields();

            /* int-Array capable of storing all ids. */
            int[] IDs = new int[IDFields.length];

            try {
                    /* Loop through all Fields and store id to array. */
                    for(int i = 0; i < IDFields.length; i++){
                            /* All fields within the subclasses of R
                             * are Integers, so we need no type-check here. */

                            // pass 'null' because class is static
                            IDs[i] = IDFields[i].getInt(null);
                    }
            } catch (Exception e) {
                    /* Exception will only occur on bad class submitted. */
                    throw new IllegalArgumentException();
            }
            return IDs;
    }

}

Méthode getAllResourceIDs j'ai utilisé depuis ici

0
répondu Oleg Skrypnyuk 2013-10-17 13:53:20

Une autre approche: il vous suffit de créer votre propre vue personnalisée. et oncree. ensuite, itérez L'objet AttributeSet (attrs) pour trouver l'index de votre attribut. ensuite, appelez simplement getAttributeResourceValue avec index, puis vous obtiendrez la valeur ResouceID initiale. un exemple simple d'extension ImageView pour obtenir ResourceID pour l'arrière-plan:

public class PhoneImageView extends ImageView {

    private static final String BACKGROUND="background";
    private int imageNormalResourceID;

    public PhoneImageView(Context context) {
        super(context);
    }

    public PhoneImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        for (int i = 0; i <attrs.getAttributeCount() ; i++) {
            if(attrs.getAttributeName(i).equals(BACKGROUND)){
                imageNormalResourceID =attrs.getAttributeResourceValue(i,-1);
            }
        }
    }

    public PhoneImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


}

Cette approche convient à ceux qui cherchent à stocker des valeurs initiales.. la solution fournie par Bojan Kseneman (+1 vote) est de garder ref à resourceID chaque fois que la vue est modifiée.

0
répondu Maher Abuthraa 2015-08-19 19:07:05

Vous pouvez obtenir l'id d'une image avec son nom de code ci-dessous.

int drawableImageId = getResources().getIdentifier(imageName,"drawable", getPackageName());
-4
répondu Senthil Mg 2011-07-07 18:07:20