티스토리 뷰
오늘은 간단하게 안드로이드 TextView에 취소선을 넣는 방법과, 제가 삽질했던 경험을 공유하고자 합니다.
먼저 제가 왜 취소선을 구현해야 할 필요성이 생겼는지에 대해서 소개하고자 합니다.
밥대생에 나오던 식당들 중에 문을 닫는 식당들이 늘어나면서, 폐업 여부를 앱에서 뿌려줘야 할 필요성이 생겼습니다.
처음에는 [폐업]이라고 식당 이름 앞에 붙여서 표시하였으나, 취소선을 함께 활용하면 더 잘 인지되게 할 수 있지 않을까? 라는 가설을 세웠고,
이 가설을 실험해 보기 위해 취소선을 구현해보기로 했습니다.
먼저 언제나 그랬듯이, 구글링을 시작했습니다.
구글 검색을 통해 정말 많은 글들을 검색해 볼 수 있었는데요.
많은 블로그들에서 취소선을 다음과 같이 설정하라고 알려주고 있었습니다.
textView.setPaintFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
그리고, 다음과 같이 취소선을 해제하라고 알려줬습니다.
textView.setPaintFlags(textView.getPaintFlags() ^ Paint.STRIKE_THRU_TEXT_FLAG);
하지만, 문제가 있었습니다. ListView 내에서 취소선 적용이 제대로 되지 않는 사실을 발견했습니다.
왜일까? 저는 취소선을 해제하는 방식에 문제가 있다고 판단했고, 더 많은 자료들을 찾아보기 시작했습니다.
그러다 이 블로그(http://dev-daddy.tistory.com/20)를 찾았고, 이 블로그에서 말한 대로, 취소선 해제를 아래와 같이 하니 제대로 동작했습니다.
textView.setPaintFlags(0);
정상적으로 동작하기는 했지만, 이게 최선일까?
FLAG는 어떤 Object의 True/False로 된 성질들을 한꺼번에 저장하고 불러올 때 사용하는 방식입니다.
취소선 해제를 위해서 TextView의 모든 Flag를 0으로 만든 방식은 저희 케이스에서는 정상적으로 동작하기는 하겠지만,
혹시 추후에 다른 Flag를 추가하게 된다면 해당 Flag도 모두 사라지는 결과를 낳을 것입니다.
Android Studio 내에서 Paint.STRIKE_THRU_TEXT_FLAG 에 마우스를 오버해보시면, value가 16으로 뜨는 것을 확인하실 수 있습니다.
즉, flags의 4번째 bit가 1이면 취소선을 띄우고 4번째 bit가 0이면 취소선을 제거한다는 의미입니다.
textView.setPaintFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
이런 방식의 취소선 설정 방식은 기존 flags에 4번째 bit이 무엇이든 1로 고치는 코드이기 때문에 정상 작동하였지만,
textView.setPaintFlags(textView.getPaintFlags() ^ Paint.STRIKE_THRU_TEXT_FLAG);
이 방식의 경우 자바에서 ^ 연산자는 배타적 논리합이기 때문에 기존 flgas의 4번째 bit가 1일 때는 정상작동할지 몰라도
그렇지 않은 경우(ListView나 RecyclerView 등)에는 정상작동하지 아니하는 것입니다.
이런 해석들을 토대로 취소선을 해제하는 로직을 제대로 고치면 다음과 같습니다.
textView.setPaintFlags(textView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
~ 연산자를 통해 4번째 bit만 0인 flags를 하나 만들어 주고, 기존 flags와 & 오퍼레이터를 연산함으로써, 기존 flags의 4번째 비트만 0으로 만들어준다는 의미입니다.
저와 같은 삽질을 조금이라도 줄일 수 있으시길 바라며, 글 마치겠습니다.
감사합니다.