web-dev-qa-db-fra.com

Comment changer une liste de calques dessinable?

Essayer d'apprendre de nouvelles choses et ne pas comprendre celui-ci, toute aide est appréciée. Compte tenu de ce code simple qui provient directement de la documentation de Google:

couches.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/first_image">
      <bitmap Android:src="@drawable/Android_red"
        Android:gravity="center" />
    </item>
    <item Android:id="@+id/second_image" Android:top="10dp" Android:left="10dp">
      <bitmap Android:src="@drawable/Android_green"
        Android:gravity="center" />
    </item>
    <item Android:id="@+id/third_image" Android:top="20dp" Android:left="20dp">
      <bitmap Android:src="@drawable/Android_blue"
        Android:gravity="center" />
    </item>
</layer-list>

Et main.xml:

<ImageView
    Android:id="@+myImageView"
    Android:layout_height="wrap_content"
    Android:layout_width="wrap_content"
    Android:src="@drawable/layers" />

Question: Comment puis-je référencer par programme l'un des dessinables dans la liste des calques pour pouvoir le changer en un dessinable différent?

Merci.

Alors maintenant, j'ai mon nouveau dessinable que je veux échanger dans la variable myImage correct? Maintenant, comment puis-je mettre cela dans la liste des calques? Je suppose que j'utilise findDrawableByLayerId et setDrawableByLayerId, mais comment exactement? Ou je pourrais le faire complètement mal! Aidez-moi!

Qu'est-ce que j'essaye de faire? Modifiez le dessinable affiché. Par exemple, supposons que j'avais un autre dessinable appelé "Android_purple", comment pourrais-je le changer pour le dessinable "Android_green" dans l'exemple de liste de couches ci-dessus?

MODIFIER:

Avec mes connaissances limitées, voici mon code jusqu'à présent (qui fonctionne pas, j'obtiens une erreur indiquant que setDrawableByLayerId n'est pas défini):

Resources res = getApplicationContext().getResources();
BitmapDrawable newImage = (BitmapDrawable) res.getDrawable(R.drawable.Android_purple); //Get replacement image, can't use LayerDrawable or get error.   
boolean layer_drawable_changed = (setDrawableByLayerId((R.id.second_image), newImage)); //Set new drawable? Error on this line.
43
ShadowGod

Question: Comment puis-je référencer par programme l'un des dessinables dans la liste des calques afin de pouvoir le changer en un dessinable différent?

Voici ce que j'essaierais:

Étape # 1: Mettez les attributs Android:id Sur les éléments <item> Comme illustré dans la documentation

Étape # 2: transtyper le résultat getDrawable() en LayerDrawable

Étape # 3: Appelez mutate() si vous ne voulez pas affecter quelqu'un d'autre à l'aide de Drawable (peut être facultatif)

Étape # 4: Appelez setDrawableByLayerId() pour définir/remplacer un Drawable pour un ID de couche donné

52
CommonsWare

Étape 1: récupérer la liste des calques dans le dossier drawable: (Le mien s'appelait chiffres à /res/drawable/digits.xml)

LayerDrawable ld = (LayerDrawable) getResources().getDrawable(R.drawable.digits);

Étape 2: Nommez l'image de remplacement (pas l'image déjà dans la liste des calques)

Drawable replace = (Drawable) getResources().getDrawable(R.drawable.replacing_image);

Étape 3: remplacer l'image à l'aide de la méthode setDrawableByLayerId (int id, Drawable d)

boolean testfactor = ld.setDrawableByLayerId(R.id.first_image, replace);

Cela renvoie une valeur booléenne qui retournera false si le remplacement de l'image a échoué

Étape 4: Charger l'image principale (essentiellement l'identifiant de la liste des couches dans le code de mise en page XML réel)

ImageView layoutlist1 = (ImageView)findViewById(R.id.layout_list1);

Étape 5: (re) -Définissez Imageview avec votre LayerDrawable mis à jour en disant:

layoutlist1.setImageDrawable(ld);

RESSOURCES: Je suis développeur de logiciels et d'applications mobiles.

J'ai regardé partout sur le Web et beaucoup de Stackflow.com afin d'arriver à ce point. Toutes les réponses étaient comme celles qui étaient déjà sur cette page. J'essayais de faire la même chose. Puis j'ai pensé à l'idée de "mettre à jour l'image" et j'y suis arrivé.

Cette devrait/peut aussi fonctionner lorsque vous souhaitez mettre un bitmap à la place de l'un des éléments de votre liste. Il vous suffit d'utiliser la méthode replace (setDrawableByLayerId). à remplacer sur les identifiants. ImageView a beaucoup de méthodes.

Cela a également été utile: LayerList drawable + conversion to a Bitmap

51
Kavita