2011-07-22 3 views
61

Mon code ressemble à ceci:Suppression d'un drapeau de la peinture dans Android

TextView task_text = (TextView) view.findViewById(R.id.task_text); 
    task_text.setPaintFlags(task_text.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 

Cela provoque une grève par effet apparaître sur le texte. Cependant, j'aimerais savoir comment retirer le drapeau une fois qu'il a été réglé et comment détecter que le drapeau est activé. Je comprends que c'est une opération au niveau du bit, mais j'ai essayé les deux opérateurs ~ et -, ni travailler.

Répondre

150

Pour retirer un drapeau, cela devrait fonctionner:

task_text.setPaintFlags(task_text.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG)); 

Ce qui signifie mis tous les drapeaux fixés, à l'exception de Paint.STRIKE_THRU_TEXT_FLAG.

Pour vérifier si un drapeau est réglé (Edit: pour un moment je l'ai oublié est java ...):

if ((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) > 0) 
+3

Une autre solution facile est tout simplement d'utiliser les différentes méthodes fournies sur la peinture :) –

+5

pour enlever un drapeau le faire: textView.setPaintFlags (0); ..: p –

+0

@ Dr.aNdRO J'ai essayé et ça ne marche pas pour moi. Y a-t-il autre chose que je dois faire? – Monica

14

Cela fonctionne aussi:

task_text.setPaintFlags(0); 
+0

Je pense que c'est un cas étrange où ne pas utiliser le correct est plus corret, car il n'y a aucune raison de vérifier les conditions ici, vous voulez juste 2 cas, définir le Paint.Flag ou pour l'enlever, excellente solution. – cutiko

+1

Ne faites pas cela. Cela supprime tous les drapeaux, pas seulement un particulier. –

3

utilisation OU exclusif opérateur ^ au lieu de | avec &(~) combinaison:

// setup STRIKE_THRU_TEXT_FLAG flag if current flags not contains it 
task_text.setPaintFlags(task_text.getPaintFlags()^Paint.STRIKE_THRU_TEXT_FLAG)); 

// second call will remove STRIKE_THRU_TEXT_FLAG 
task_text.setPaintFlags(task_text.getPaintFlags()^Paint.STRIKE_THRU_TEXT_FLAG)); 

Vérifiez si le drapeau est actuellement configuré:

if((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) == Paint.STRIKE_THRU_TEXT_FLAG) 
+0

Merci @Sergey C'est la seule réponse robuste ici. 1) Vérifiez si le drapeau que vous voulez supprimer est présent. 2) Si c'est le cas, retirez-le en utilisant un XOR. Je souhaite que les utilisateurs arrêtent les réponses upvoting impliquant la définition de paintFlags sur 0 ou l'utilisation de XOR avant de vérifier si l'indicateur à supprimer est présent. –

0

| --------------------------------- ----------------- |
| < *> | Souligner avec un textView:
| ------------------------------------------ -------- |

| * | Ajouter Souligné:

txtVyuVar.setPaintFlags(txtVyuVar.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); 

| * | Retirer Souligné:

txtVyuVar.setPaintFlags(txtVyuVar.getPaintFlags()^Paint.UNDERLINE_TEXT_FLAG); 

| * | Vérifiez Souligné:

if((txtVyuVar.getPaintFlags() & Paint.UNDERLINE_TEXT_FLAG) == Paint.UNDERLINE_TEXT_FLAG) 
{ 
    // Codo Todo 
} 

| * | Basculer Souligné:

if((txtVyuVar.getPaintFlags() & Paint.UNDERLINE_TEXT_FLAG) == Paint.UNDERLINE_TEXT_FLAG) 
{ 
    txtVyuVar.setPaintFlags(txtVyuVar.getPaintFlags()^Paint.UNDERLINE_TEXT_FLAG); 
} 
else 
{ 
    txtVyuVar.setPaintFlags(txtVyuVar.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); 
} 
0

À mon avis, vient de mettre son drapeau par défaut est un meilleur choix. Sinon, le texte sera déchiqueté. Le drapeau par défaut dans TextView (EditText étend TextView) est

Paint.ANTI_ALIAS_FLAG 

et définir un nouveau paintflag remplacera le précédent. J'ai fait un test pour le vérifier. Alors, comme ceci:

task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG);