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.

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)

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

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()

¡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)

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

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.