Quitar una bandera de pintura en Android

83

Mi código se ve así:

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

Esto hace que aparezca un efecto de tachado en el texto. Sin embargo, me gustaría saber cómo eliminar la bandera una vez configurada y cómo detectar que la bandera está configurada.

Entiendo que esta es una operación bit a bit, pero he probado los operadores ~ y -, ninguno funciona.

James
fuente

Respuestas:

184

Para eliminar una bandera, esto debería funcionar:

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

Lo que significa establecer todas las banderas establecidas, excepto de Paint.STRIKE_THRU_TEXT_FLAG.

Para verificar si se establece una bandera (Editar: por un momento olvidé que es java ...):

if ((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) > 0)
MByD
fuente
3
Otra solución fácil es simplemente utilizar los diversos métodos proporcionados en Paint :)
Romain Guy
@ Dr.aNdRO Lo intenté y no me funciona. ¿Hay algo más que deba hacer?
Monica
@Monica Necesito ver tu código para esto. Probé ambos métodos y funcionan bien. ¿Puedes comenzar un nuevo hilo?
Dr. ANDRO
1
@ Dr.aNdRO: si se establece en 0, se eliminarán TODOS los indicadores, no solo se eliminará un indicador específico, considere eliminar su comentario o actualizar para responder correctamente la pregunta.
Michael Peterson
1
6 años después y caí en tu trampa en una aplicación de producción. @ Dr.aNdRO. POR FAVOR BORRE SU COMENTARIO. ES MUY MAL AVISO. Su mensaje dice to remove a, mientras que eliminará TODAS las banderas.
Zun
26

Esto también funciona:

task_text.setPaintFlags(0);
arun-r
fuente
Creo que este es un caso extraño en el que no usar el correcto es más correcto, porque no hay razón para verificar las condiciones aquí, solo desea 2 casos, configure Paint.Flag o elimínelo, excelente solución.
cutiko
2
No hagas esto. Esto elimina TODAS las banderas, no solo una en particular.
Michael Peterson
21

En Kotlin

task_text.paintFlags = task_text.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
Blazej SLEBODA
fuente
¡No estoy seguro de por qué no funciona para mí! tvPhone.autoLinkMask = Linkify.ALL, luego tvPhone.text = "1-800-12345", luegotvPhone.paintFlags = tvPhone.paintFlags and Paint.UNDERLINE_TEXT_FLAG.inv()
Dr.jacky
6

Utilice el operador OR exclusivo en^ lugar de |con la &(~)combinación:

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

Compruebe si la bandera está configurada actualmente:

if((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) == Paint.STRIKE_THRU_TEXT_FLAG)
XIII-th
fuente
Gracias @Sergey Esta es la única respuesta sólida aquí. 1) Verifique si la bandera que desea eliminar está presente. 2) Si es así, quítelo con un XOR. Deseo que los usuarios dejen de votar respuestas que impliquen configurar los paintFlags en 0 o usar XOR antes de verificar si la bandera que se va a eliminar está presente.
Michael Peterson
5

| ------------------------------------------------- - |
| <*> | Subrayar con un textView:
| -------------------------------------------- ------ |

| * | Agregar subrayado:

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

| * | Eliminar subrayado:

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

| * | Comprobar subrayado:

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

| * | Alternar subrayado:

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 ONU
fuente
4

En mi opinión, simplemente establecer su bandera predeterminada es una mejor opción. De lo contrario, el texto se verá irregular. La bandera predeterminada en TextView (EditText extiende TextView) es

Paint.ANTI_ALIAS_FLAG

Y establecer una nueva bandera de pintura reemplazará a la anterior. He hecho una prueba para verificarlo. Así que, así:

task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG);
sanmianti
fuente