Xóa cờ Paint trong Android


83

Mã của tôi trông như thế này:

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

Điều này gây ra hiệu ứng gạch ngang xuất hiện trên văn bản. Tuy nhiên, tôi muốn biết cách xóa cờ sau khi được đặt và cách phát hiện cờ đã được đặt.

Tôi hiểu đây là một phép toán thông minh, nhưng tôi đã thử cả hai toán tử ~ và -, đều không hoạt động.

Câu trả lời:


184

Để xóa cờ, điều này sẽ hoạt động:

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

Có nghĩa là đặt tất cả các cờ đã đặt, ngoại trừ của Paint.STRIKE_THRU_TEXT_FLAG.

Để kiểm tra xem cờ đã được đặt chưa (Chỉnh sửa: trong giây lát tôi quên mất đó là java ...):

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

3
Một giải pháp dễ dàng chỉ đơn giản là sử dụng các phương pháp khác nhau được cung cấp trên sơn :)
Romain Guy

@ Dr.aNdRO Tôi đã thử và nó không hiệu quả với tôi. Có việc gì khác tôi cần làm không?
Monica

@Monica Tôi cần xem mã của bạn cho việc này. Tôi đã thử cả hai phương pháp và chúng đều hoạt động tốt. Bạn có thể bắt đầu một chủ đề mới không?
Tiến sĩ aNdRO

1
@ Dr.aNdRO - Đặt thành 0 sẽ xóa TẤT CẢ cờ, không chỉ xóa một cờ cụ thể, vui lòng xem xét xóa nhận xét của bạn hoặc cập nhật để trả lời chính xác câu hỏi.
Michael Peterson

1
6 năm sau và tôi rơi vào bẫy của bạn trong một ứng dụng sản xuất. @ Dr.aNdRO. HÃY XÓA Ý KIẾN CỦA BẠN. LỜI KHUYÊN RẤT XẤU. Tin nhắn của bạn cho biết to remove a, trong khi nó sẽ xóa TẤT CẢ các cờ.
Zun

26

Điều này cũng hoạt động:

task_text.setPaintFlags(0);

Tôi nghĩ rằng đây là một trường hợp lạ khi không sử dụng đúng là nhiều nút hơn, vì không có lý do gì để kiểm tra các điều kiện ở đây, bạn chỉ muốn 2 trường hợp, đặt Paint.Flag hoặc loại bỏ nó, giải pháp tuyệt vời.
cutiko

2
Đừng làm điều này. Thao tác này sẽ xóa TẤT CẢ các cờ, không chỉ một cờ cụ thể.
Michael Peterson

21

Trong Kotlin

task_text.paintFlags = task_text.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()

Không chắc tại sao nó không hoạt động với tôi! tvPhone.autoLinkMask = Linkify.ALL, sau đó tvPhone.text = "1-800-12345", sau đótvPhone.paintFlags = tvPhone.paintFlags and Paint.UNDERLINE_TEXT_FLAG.inv()
Dr.jacky

6

Sử dụng độc quyền HOẶC điều hành ^thay vì |với &(~)sự kết hợp:

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

Kiểm tra xem cờ hiện đã được thiết lập chưa:

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

Cảm ơn bạn @Sergey Đây là câu trả lời chắc chắn duy nhất ở đây. 1) Kiểm tra xem lá cờ bạn muốn xóa có xuất hiện không. 2) Nếu có, hãy xóa nó bằng cách sử dụng XOR. Tôi ước người dùng sẽ ngừng ủng hộ các câu trả lời liên quan đến việc đặt paintFlags thành 0 hoặc sử dụng XOR trước khi kiểm tra xem cờ cần xóa có xuất hiện hay không.
Michael Peterson

5

| ------------------------------------------------- - |
| <*> | Gạch chân với một textView:
| -------------------------------------------- ------ |

| * | Thêm gạch chân:

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

| * | Xóa gạch chân:

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

| * | Kiểm tra gạch chân:

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

| * | Chuyển đổi gạch chân:

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

Theo tôi, chỉ cần đặt cờ mặc định của nó là một lựa chọn tốt hơn. Nếu không, văn bản sẽ trông như răng cưa. Cờ mặc định trong TextView (EditText mở rộng TextView) là

Paint.ANTI_ALIAS_FLAG

Và thiết lập một paintflag mới sẽ thay thế cái trước đó. Tôi đã thực hiện một bài kiểm tra để xác minh nó. Vì vậy, giống như thế này:

task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.