69 votes

setBackgroundResource() ignore mes attributs de schéma XML

J'ai un point de vue qui est utilisé comme un élément dans un ListView. Dans ma coutume adaptateur, j'ai changer l'arrière-plan de la vue à l'aide d' View.setBackgroundResource() en fonction de la position d'élément dans la liste. (Je n'ai séparé actifs pour le premier et le dernier élément de la liste.)

Ceci définit la bonne image d'arrière-plan comme prévu, mais il a le côté méchant effet que tous le rembourrage que j'avais mis dans le fichier XML de définition de la vue est complètement ignoré.

(Si je l'ai mis à l'arrière-plan dessiné dans le XML, et n'essayez pas de la modifier à l'exécution dans l'adaptateur, le rembourrage tous fonctionne bien.)

Comment puis-je modifier l'image d'arrière-plan, et de conserver le rembourrage? Est-ce un bug?

EDIT il semble que quelqu'un d'autre a constaté le même problème ici: modification de l'arrière-plan également modifier le remplissage d'un LinearLayout?

106voto

dmon Points 20795

Je suis tombé sur cette question. Je présume que vous êtes à l'aide d'un LayerList ressources drawable? C'est ce que j'utilisais. Malheureusement, je n'ai trouvé aucune "vraie" façon de le fixer, il semble comme un bug dans le code, mais je n'ai pas le chasser vers le bas. Cependant, j'ai été chanceux dans le sens que j'ai le "buggy" arrière-plan après mon point de vue avait déjà été rendu correctement, donc c'était juste une question de les sauvegarder puis restaurer les valeurs de remplissage, après l'arrière-plan est défini, e.g:

  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: Comme alternative, vous n'avez pas à utiliser les valeurs précédentes de rembourrage, 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);

11voto

Brandon Romano Points 413

En ajoutant à ce que dmon a suggéré, voici une fonction que vous pouvez simplement ajouter à votre classe util pour que vous n'ayez pas à sauter dans les anneaux chaque fois que vous mettez à jour une ressource. Ceci 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);
}
 

6voto

Artem Russakovskii Points 7341

Une autre solution pour laquelle j’ai opté au lieu d’obtenir et de définir le padding dans le code proposé par dmon n’utilise pas le padding, mais plutôt les marges pour les éléments internes.

En fonction de votre mise en page, il peut en réalité s'agir de la même quantité de code XML et ne nécessiter aucune Java. Cela me semble un peu plus sale, mais pas aussi sale que d'ajouter ce code Java partout.

-1voto

Samus Arin Points 1117

Dans Monodroid, si je diffuse l'appel vers SetBackgroundResource, le remplissage 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 remplissage à gauche est réinitialisé à 0!? S'il n'est pas publié, tout le remplissage est réinitialisé à 0.

Je pensais que c'était une découverte intéressante à signaler sur ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X