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?
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.
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"
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;
}
}
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
Il y a quelques étapes à cela:
créer un tableau de nombres entiers pour contenir les noms des drawables (ie: "@ drawable/icon1" ... "@ drawable/iconN"
utilisez getIdentifier ci-dessus pour obtenir le "tableau"
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.
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".
utilisez cet ID pour définir l'image à afficher.
HOpe cela vous aidera.
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.