web-dev-qa-db-fra.com

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 une ImageView et je peux d'abord utiliser icon.png comme image mais plus tard, je peux changer l'image en icon2.png. Je veux découvrir à l'aide du code que l'image que mon ImageView utilise à partir de la ressource. Y a-t-il un moyen?

24
Farhan

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.-à-d. utilisez setImageResource() pour définir les images initial lors de l'initialisation et garder une trace des resource ids utilisé quelque part dans votre code.

Par exemple, vous pouvez avoir un tableau de imageviews avec un tableau correspondant de int qui contient le resource id pour chaque imageview

Ensuite, chaque fois que vous souhaitez modifier l'image, parcourez le tableau et voyez ce qu'est l'ID.

6
f20k

Celui-ci est la meilleure méthode pour trouver la valeur R.drawablw.image1 lorsque vous cliquez sur ImageView dans votre programme, La méthode est un peu comme celle du programme principal, tout d'abord enregistrez la valeur de 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
PIR FAHIM SHAH

Créez une vue d'image personnalisée, 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
Bojan Kseneman

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

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

J'ai donc mis tous les drawables dans une table de hachage 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>

MyActivity.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 que j'ai utilisée depuis ici

0
Oleg Skrypnyuk

Il y a quelques étapes à cela:

  1. créer un tableau de nombres entiers pour contenir les noms des drawables (ie: "@ drawable/icon1" ... "@ drawable/iconN"

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

  3. avec l'ID pour la liste des dessinables, getStringArray vous donnera un tableau des noms des dessinables que vous avez spécifié à l'étape 1.

  4. puis utilisez à nouveau l'un des noms de dessin dans le tableau avec getIdentifier pour obtenir l'ID de dessin. Cela utilise "drawable" au lieu du type "array".

  5. utilisez cet ID pour définir l'image à afficher.

HOpe cela vous aidera.

0
KITT

Autre approche: il vous suffit de créer votre propre vue personnalisée. et onCreate. puis itérez l'objet AttributeSet (attrs) pour trouver l'index de votre attribut. puis appelez simplement getAttributeResourceValue avec index, puis vous obtiendrez la valeur ResouceID initiale. un exemple simple d'extension d'ImageView pour obtenir ResourceID en 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 les valeurs initiales. La solution fournie par Bojan Kseneman (+1 vote) consiste à conserver ref à resourceID chaque fois que la vue est modifiée.

0
Maher Abuthraa