Удалить флаг Paint в Android

83

Мой код выглядит так:

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

В результате на тексте появляется эффект зачеркивания. Однако я хотел бы знать, как удалить установленный флаг и как определить, что он установлен.

Я понимаю, что это побитовая операция, но я пробовал оба оператора ~ и -, ни один из них не работает.

Джеймс
источник

Ответы:

184

Чтобы удалить флаг, это должно сработать:

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

Это означает установить все установленные флаги, кроме Paint.STRIKE_THRU_TEXT_FLAG.

Чтобы проверить, установлен ли флаг (Edit: на мгновение я забыл, что это java ...):

if ((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) > 0)
МБыД
источник
3
Еще одно простое решение - просто использовать различные методы, представленные в Paint :)
Romain Guy
@ Dr.aNdRO Я пробовал, но у меня не работает. Что мне еще нужно сделать?
Моника
@Monica Мне нужен ваш код для этого. Я пробовал оба метода, и они отлично работают. Можете ли вы начать новую тему?
Dr. aNdRO
1
@ Dr.aNdRO - установка на 0 удалит ВСЕ флаги, а не только конкретный флаг, пожалуйста, подумайте об удалении вашего комментария или обновлении, чтобы правильно ответить на вопрос.
Майкл Петерсон
1
Шесть лет спустя я попался в вашу ловушку в производственном приложении. @ Dr.aNdRO. ПОЖАЛУЙСТА, УДАЛИТЕ ВАШ КОММЕНТАРИЙ. ЭТО ОЧЕНЬ ПЛОХОЙ СОВЕТ. В вашем сообщении сказано to remove a, что он удалит ВСЕ флаги.
Zun
26

Это тоже работает:

task_text.setPaintFlags(0);
Arun-R
источник
Я думаю, что это странный случай, когда неправильное использование более корректно, потому что нет причин проверять здесь условия, вам просто нужны 2 случая, установите Paint.Flag или удалите его, отличное решение.
cutiko
2
Не делай этого. Это удаляет ВСЕ флаги, а не только один.
Майкл Петерсон
21

В Котлине

task_text.paintFlags = task_text.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
Блажей СЛЕБОДА
источник
Не знаю, почему у меня это не работает! tvPhone.autoLinkMask = Linkify.ALL, затем tvPhone.text = "1-800-12345", тогдаtvPhone.paintFlags = tvPhone.paintFlags and Paint.UNDERLINE_TEXT_FLAG.inv()
Доктор Джеки
6

Используйте исключающего ИЛИ оператор ^вместо |с &(~)комбинацией:

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

Проверьте, установлен ли в данный момент флаг:

if((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) == Paint.STRIKE_THRU_TEXT_FLAG)
XIII-й
источник
Спасибо, @Sergey. Это единственный надежный ответ. 1) Проверьте, присутствует ли флаг, который вы хотите удалить. 2) Если это так, удалите его с помощью XOR. Я бы хотел, чтобы пользователи перестали голосовать за ответы, которые включают установку paintFlags на 0 или использование XOR, прежде чем проверять, присутствует ли флаг для удаления.
Майкл Петерсон,
5

| ------------------------------------------------- - |
| <*> | Подчеркнуть с помощью textView:
| -------------------------------------------- ------ |

| * | Добавить подчеркивание:

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

| * | Удалить подчеркивание:

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

| * | Проверить подчеркивание:

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

| * | Переключить подчеркивание:

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

На мой взгляд, лучше просто установить флаг по умолчанию. В противном случае текст будет выглядеть неровным. Флаг по умолчанию в TextView (EditText расширяет TextView):

Paint.ANTI_ALIAS_FLAG

И установить новый Paintflag заменит предыдущий. Я сделал тест, чтобы это проверить. Итак, вот так:

task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG);
Sanmianti
источник