SetBackgroundResource () rejette mes attributs de mise en page XML

J'ai une vue qui est utilisée comme élément dans un ListView . Dans mon adaptateur personnalisé, je modifie l'arrière-plan de la vue en utilisant View.setBackgroundResource() fonction de la position de l'élément dans la liste. (J'ai des actifs distincts pour le premier et dernier élément de la liste.)

Cela définit l'image d'arrière-plan correcte comme prévu, mais il a l'effet secondaire méchant que tout le rembourrage que je définirai dans la définition XML de la vue est complètement ignoré.

  • Comment incrémenter le score des joueurs dans les classements dans le service Android Google Play?
  • Modèle de tableau de bord Android
  • Changer le rembourrage dans le sélecteur
  • Définit par programme la marge / rembourrage de la vue de texte dans une liste
  • Mesurer la largeur du texte à dessiner sur Canvas (Android)
  • Comment configurer le rembourrage pour le widget CardView dans Android L
  • (Si je définis l'arrière-plan Drawable dans le XML, et n'essayez pas de le modifier à l'exécution dans l'adaptateur, le rembourrage fonctionne bien.)

    Comment puis-je modifier l'image de fond et conserver le rembourrage? Est-ce un bug?

    EDITEz- vous que quelqu'un d'autre a trouvé le même problème ici: le changement d'arrière-plan modifie-t – il également le rembourrage d'un LinearLayout?

  • Android crée des couches en toile
  • 5 Solutions collect form web for “SetBackgroundResource () rejette mes attributs de mise en page XML”

    J'ai également rencontré cette question. On peut supposer que vous utilisez une ressource LayerList, attirable? C'est ce que j'utilise. Malheureusement, je n'ai trouvé aucun moyen "réel" de le réparer, cela semble être un bug dans le code, mais je ne l'ai pas poursuivi. Cependant, j'ai eu de la chance en ce sens que j'établissais le fond de «buggy» après que ma vue avait déjà été correctement rendue, donc il s'agissait simplement d'enregistrer, puis de restaurer les valeurs de rembourrage après l'établissement du fond, par exemple:

      if(condition) { int bottom = theView.getPaddingBottom(); int top = theView.getPaddingTop(); int right = theView.getPaddingRight(); int left = theView.getPaddingLeft(); theView.setBackgroundResource(R.drawable.entry_bg_with_image); theView.setPadding(left, top, right, bottom); } 

    EDIT: En variante, vous ne devez pas utiliser les valeurs précédentes de remplissage, vous pouvez également utiliser une valeur de dimension:

      int pad = resources.getDimensionPixelSize(R.dimen.linear_layout_padding); theView.setBackgroundResource(R.drawable.entry_bg_with_image); theView.setPadding(pad, pad, pad, pad); 

    En ajoutant à ce que dmon a suggéré, voici une fonction que vous pouvez jeter dans votre classe d'utilité, de sorte que vous ne devez pas passer à travers les cercles chaque fois que vous mettez à jour une ressource. C'est vraiment juste son code enveloppé dans une fonction.

     public static void updateBackgroundResourceWithRetainedPadding(View view, int resourceID) { int bottom = view.getPaddingBottom(); int top = view.getPaddingTop(); int right = view.getPaddingRight(); int left = view.getPaddingLeft(); view.setBackgroundResource(resourceID); view.setPadding(left, top, right, bottom); } 

    Cela est corrigé dans Lollipop, alors

     public static void setBackgroundResource(@NonNull View view, @DrawableRes int resId) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { int paddingTop = view.getPaddingTop(); int paddingLeft = view.getPaddingLeft(); int paddingRight = view.getPaddingRight(); int paddingBottom = view.getPaddingBottom(); view.setBackgroundResource(resId); view.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); } else { view.setBackgroundResource(resId); } } 

    Une autre solution que j'ai opté pour au lieu d'obtenir et de configurer le rembourrage dans le code que nous proposons n'utilise pas le rembourrage et utilise plutôt des marges pour les éléments internes.

    Selon votre mise en page, il se peut qu'il contienne la même quantité de code XML et ne nécessiterait aucun Java. Il me sent un peu plus sale, mais pas aussi sale que d'ajouter ce code Java partout.

    Dans Monodroid, si je publie l'appel à SetBackgroundResource, alors le rembourrage supérieur et le remplissage inférieur restent inchangés

     private EditText _etInput public void Disable() { _etInput.Post(() => { _etInput.SetBackgroundResource(Resource.Drawable.input_field_background_disabled); _etInput.Clickable = false; }); 

    Cependant, le rembourrage à gauche est réinitialisé à 0! Si ce n'est pas affiché, tout le rembourrage est réinitialisé à 0.

    J'ai pensé que c'était une découverte intéressante à publier sur …

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.