박상권의 삽질블로그

[안드로이드/Android]Linkify로 TextView의 특정단어 클릭시 URL이동시키기 본문

IT/Android-TIP (한글)

[안드로이드/Android]Linkify로 TextView의 특정단어 클릭시 URL이동시키기

박상권 2016. 8. 11. 08:51

안드로이드 개발자들이 모여있는 오픈채팅방에 참여해보세요 .
Q&A 및 팁을 공유하는 방입니다..
오픈채팅방 참여



블로그를 Medium으로 옮겨서 운영하고 있습니다.
앞으로 새로운 글은 모두 미디엄 블로그를 통해서 올릴 예정입니다.
미디엄에서 다양하고 유익한 포스팅을 살펴보세요
미디엄 블로그 보기


로그인이 필요한 대부분의 서비스를 보면 로그인화면에서 '...xxx의 이용약관, 개인정보 취급방침, ... 에 동의하시게 됩니다.' 라는 문구를 많이 보셨을겁니다.

여기서 '이용약관' 을 클릭하면 해당 서비스의 이용약관 웹페이지가 열립니다.


            


이 기능은 한문장에서 특정 단어를 눌렀을때 그와 관련된 URL을 호출해야하는 기능을 만들어야하는 요건입니다.

처음에 이 기능을 만들때 어떻게 만들어야하나 고민이 많았습니다.

각각 특정단어를 TextView로 만들어서 일렬로 쭉 붙이는것도 레이아웃상으로 말이 안되고, '개인정보취급방침' 이라는 글씨자체는 보통의 전화번호나 http://...와 같은 URL형식이 아니기때문에 autoLink로 걸수도 없었습니다.

이 하나의 문장은 하나의 TextView에 들어가 있는것입니다.


Linkify를 이용한다면 간단하게 특정단어에 반응해서 동작을 수행하도록 설정할 수 있습니다.





사실 우리는 우리도 모르게 xml의 autoLink에서 기본적인 Linkify기능을 사용하고 있었습니다.



autoLink에 설정되어 있는 패턴의 텍스트가 포함되어 있는경우 자동으로 인식하도록 설정할 수 있습니다.

예를들어 'phone'으로 하는경우 010-AAAA-BBBB와 같은 전화번호패턴이 문장에 있으면 바로 전화를 걸수 있도록 되고

'email'로 되어있는경우, abcdefg@naver.com의 이메일패턴을 인식해서 이메일을 보낼수 있도록 합니다.




하지만 위에서 언급했던것처럼 우리는 email,phone과는 다르게 아무 연관없는 패턴의 텍스트를 인식해서 특정 url을 실행하도록 해야합니다.




이러한경우 Linkify의 addLinks()를 이용할 것입니다.

공식문서에서 살펴보면 addLinks()함수에 들어갈 인자들은 아래와 같습니다.


- text: Linkify를 적용할 대상 TextView

- pattern: 감지하고자 하는 텍스트의 패턴(Pattern 클래스로 텍스트를 컴파일)

- scheme: 해당 텍스트를 눌렀을때 이동시킬 URL

- matchFilter: 허용하고자 하는 매칭패턴을 설정해줄 filter

- transformFilter: 감지된 텍스트와 이동시킬 URL를 활용해서 Custom하게 url을 설정해줄 filter






물론 설명만 읽고서는 이해가 안갑니다..백문이불여일견!

코드를 보시면서 따라오시면 쉽게 이해하실 수 있습니다.




여기서 눈여겨 보실 부분은 TransformFilter의 transformUrl()입니다.

만약 이 필터를 설정하지 않는다면 '셀폰'이라는 텍스트에 대해서 'http://selphone.co.kr' 의 url을 설정해놓은것에 대해서 실제로는 2개가 합쳐진 'http://selphone.co.kr셀폰'으로 url이 만들어져 버립니다.

즉, 우리가 설정한 scheme뒤에 감지하고자한 텍스트가 붙어버리는 현상이 발생합니다.

그래서 우리는 뒤에 어떤 텍스트도 추가되지 않도록 transformUrl()함수에서 공백을 리턴해줍니다.

그렇게하면 온전히 우리가 설정한 url scheme이 실행됩니다.

transformUrl()를 잘 응용한다면 감지된 텍스트에 따라서 뒤에 이동시킬 url을 다르게 바꿔줄 수도 있는 기능입니다.


문제없이 잘 만드셨다면 아래와 같은 화면을 볼 수 있습니다.



위의 소스코드에서 설정한대로 '셀폰' 을 인식했고 이 텍스트를 누를경우 http://selphone.co.kr로 이동합니다.

아래 텍스트도 마찬가지로 동작합니다.



여기서 좀더 응용해본다면 Custom Scheme을 이용해서 텍스트를 눌렀을때 특정 액티비티를 실행시킬수도 있습니다.

Csutom URL Scheme에대해 궁금하시다면 아래 포스팅을 참고하세요

[IT/Android-TIP (한글)] - [안드로이드]URL로 액티비티 실행하는 방법(Custom URL Scheme)




지금까지 Linkify를 이용해서 TextView의 특정단어를 클릭시 지정한 URL을 실행하는 방법에 대해 포스팅해보았습니다.

감사합니다.

Comments