Entfernen Sie eine Malflagge in Android

83

Mein Code sieht folgendermaßen aus:

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

Dadurch wird im Text ein Durchschlagseffekt angezeigt. Ich möchte jedoch wissen, wie man das einmal gesetzte Flag entfernt und wie man erkennt, dass das Flag gesetzt ist.

Ich verstehe, dass dies eine bitweise Operation ist, aber ich habe sowohl ~ als auch - Operatoren ausprobiert, beide funktionieren nicht.

James
quelle

Antworten:

184

Um eine Flagge zu entfernen, sollte dies funktionieren:

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

Dies bedeutet, dass alle gesetzten Flags außer gesetzt sind Paint.STRIKE_THRU_TEXT_FLAG.

So überprüfen Sie, ob ein Flag gesetzt ist (Bearbeiten: für einen Moment habe ich vergessen, dass es Java ist ...):

if ((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) > 0)
MByD
quelle
3
Eine andere einfache Lösung besteht darin, einfach die verschiedenen Methoden zu verwenden, die auf Paint bereitgestellt werden :)
Romain Guy
@ Dr.aNdRO Ich habe es versucht und es funktioniert nicht für mich. Muss ich noch etwas tun?
Monica
@Monica Ich muss deinen Code dafür sehen. Ich habe beide Methoden ausprobiert und sie funktionieren cool. Kannst du einen neuen Thread starten?
Dr. aNdRO
1
@ Dr.aNdRO - Wenn Sie den Wert auf 0 setzen, werden ALLE Flags entfernt, nicht nur ein bestimmtes Flag. Bitte entfernen Sie Ihren Kommentar oder aktualisieren Sie ihn, um die Frage richtig zu beantworten.
Michael Peterson
1
6 Jahre später fiel ich in einer Produktions-App auf Ihre Falle herein. @ Dr.aNdRO. BITTE LÖSCHEN SIE IHREN KOMMENTAR. Es ist sehr schlechte Beratung. Ihre Nachricht sagt to remove a, während es ALLE Flags löscht.
Zun
25

Dies funktioniert auch:

task_text.setPaintFlags(0);
arun-r
quelle
Ich denke, dies ist ein seltsamer Fall, in dem die Nichtverwendung des richtigen mehr korrekt ist, da es keinen Grund gibt, hier nach Bedingungen zu suchen. Sie möchten nur 2 Fälle, stellen Sie die Paint.Flag ein oder entfernen Sie sie, eine großartige Lösung.
Cutiko
2
Tu das nicht. Dadurch werden ALLE Flags entfernt, nicht nur ein bestimmtes.
Michael Peterson
21

In Kotlin

task_text.paintFlags = task_text.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
Adobels
quelle
6

Verwenden Exklusiv - ODER - Operator ^statt |mit &(~)Kombination:

// 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));

Überprüfen Sie, ob das Flag gerade eingerichtet ist:

if((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) == Paint.STRIKE_THRU_TEXT_FLAG)
XIII-th
quelle
Danke @Sergey Dies ist die einzige robuste Antwort hier. 1) Überprüfen Sie, ob das Flag, das Sie entfernen möchten, vorhanden ist. 2) Wenn dies der Fall ist, entfernen Sie es mit einem XOR. Ich wünschte, Benutzer würden aufhören, Antworten zu bewerten, bei denen die paintFlags auf 0 gesetzt oder XOR verwendet werden, bevor sie prüfen, ob das zu entfernende Flag vorhanden ist.
Michael Peterson
4

| --------------------------------------------- - |
| <*> | Unterstreichen Sie mit einer Textansicht:
| ---------------------------------------- ------ |

| * | Unterstreichen hinzufügen:

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

| * | Unterstreichen entfernen:

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

| * | Check Underline:

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

| * | Unterstreichen umschalten:

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);
}
Sujay UN
quelle
4

Meiner Meinung nach ist es besser, nur das Standardflag zu setzen. Andernfalls wird der Text gezackt angezeigt. Das Standardflag in TextView (EditText erweitert TextView) ist

Paint.ANTI_ALIAS_FLAG

Wenn Sie eine neue Farbflagge setzen, wird die vorherige ersetzt. Ich habe einen Test durchgeführt, um dies zu überprüfen. Also einfach so:

task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG);
Sanmianti
quelle