web-dev-qa-db-fra.com

Comment forcer une vue à redessiner immédiatement avant l'exécution de la ligne de code suivante

J'ai une linearlayout que je voudrais changer la couleur d'arrière-plan du moment où une de ses vues d'enfant (un image-image) est cliquée. Je suis capable de le faire, mais pas immédiatement - le changement ne se produit pas à l'écran avant la plus tard (je pense lors d'un appel d'onresume). Je voudrais savoir comment forcer la mise en page à redessiner après le contexte défini, avant que la ligne suivante du code n'exécute. Voici la méthode onclick de mon onclicklistener pour le bouton:

public void onClick(View v) {

  LinearLayout parentLayout = (LinearLayout) v.getParent();
  parentLayout.setBackgroundResource(R.color.my_color);
  SystemClock.sleep(1000); //ms

}

La commande de sommeil est là pour tester si la redraw se produit avant ou après. Le résultat: après. La plupart des questions sur ce sujet (comme - ici et ici ) Disons à utiliser Invalidate () sur la vue. J'ai utilisé les commandes parentLayout.invalidate();, parentLayout.postInvalidate(); et parentLayout.refreshDrawableState(); Entre l'arrière-plan et les lignes de sommeil, tout en vain. Le redessinement se produit toujours après la commande Sleep. Quelqu'un peut-il me dire comment le faire se produire immédiatement?

Autres informations éventuellement utiles: Le linearlayout est lié aux lignes d'une liste de liste et l'OnClickListener ci-dessus est dans une classe personnalisée qui étend SimpleCursoradapter, non pas dans l'activité elle-même. (De cette façon, je peux définir un auditeur pour chacune des lignes de la liste de lecture.)

21
pvans

D'accord, j'ai enfin trouvé une solution à cette question et c'est simple. Il semble que le problème était juste que j'exécutitais les changements d'incitation dans un onclicklistener, lorsque j'aurais dû le faire dans un Ontouchlistener. Si je définis un ertouchlistener pour mon bouton qui recherche Action_Down, puis exécute la mise à niveau SetbackgroundColor sur sa mise en page parent, le changement se produit immédiatement.

Une solution alternative et moins robuste provient de ce post . Vous pouvez attribuer un sélecteur pour l'arrière-plan de la mise en page parent dans XML, puis dans l'ONTOUCHLISTENER mentionné ci-dessus, exécutez la méthode de la méthode. Ce n'est pas une excellente solution car le sélecteur vous donne beaucoup moins de liberté que de modifier directement les propriétés de la vue dans le code. Vous ne pouviez pas régler l'arrière-plan de la mise en page sur une couleur différente en appuyant sur un bouton différent, par exemple.

Merci à ceux qui ont aidé avec des suggestions à ce sujet!

2
pvans

faire les modifications et appelez ListView.invalidate (); refléter ces changements sur l'interface utilisateur

1
Jana