Android

khris'log

Programmer, IRCitizen.

email: khris@khrislog.net
twitter: @KHRISMIZER

Jun 25

간편하지만 불안정한 TextView 링크 다루기

TextView에는 링크 기능이 있다.

  1. android:autoLinks 속성을 none 이외의 다른것으로 바꾸면 별도의 처리 없이 본문 내의 이메일, 웹 주소등을 알아서 클릭 가능한 링크로 바꾼다.
  2. android:linksClickabletrue로 두고
    1. 직접 Spanned를 길게 이어 붙일 경우 ClickableSpan의 자식 클래스를 구현하거나 맘 편하게 UrlSpan을 사용한다. TextView.setText()가 받는 것이 CharSequenceSpanned를 받는게 가능하다.
    2. 하지만 나는 귀찮으니 Html.fromHtml()를 사용한다. 모든 엘리먼트를 지원하지 않으니 소스를 까보면 된다. 그냥 switch문 안에 다 있다.

그리고 공통적으로

textView.setMovementMethod(new LinkMovementMethod());

를 해준다. 기본 셋팅으로는 링크 클릭해도 다루질 않음.

나는 ContentProvider에서 이미지를 제외한 대부분의 데이터를 제공하게 하고 Intent.ACTION_* 시리즈에 각각 알맞는 Activity를 붙여놓는지라 위의 방법을 선호한다. 그런데 사소한 문제가 있다. URL만 가지고 모든 호출을 할 수 없다. URLSpan 내부적으로 주어진 URL은 Intentdata로만 취급하고 Action으로는 Intent.ACTION_VIEW를 주기 때문에 intent: 스키마로 시작하는 URL을 사용해도 시스템은 응답하지 않는다.

그런데 마침 매우 Intent.ACTION_WEB_SEARCH 액션에 SearchManager.QUERYextra 데이터로 넣어서 시스템 기본 웹 검색 제공자를 호출하고 싶다. 여러가지 방법이 있겠으나 다음과 같은 방법이 결함은 있어도 제일 편하다. 일단 링크 보시고.

http://stackoverflow.com/a/3452944/192243

그럼 이제 프록시를 만들어보면…

소스 코드 gist 링크

이렇게 되니까 알아서 하면 된다.

결함이 뭐죠

저런 암시적인(Implict) Intent 호출은 시스템 전체의 Activity를 모두 호출 대상으로 두기 때문에 같은 Intent 필터를 걸어놓을 경우 막을 수가 없다. 그럴 경우 어떤 앱(사실은 Activity다)으로 열거냐고 물어보는데 보기에도 그리 좋지 않고 앱이 망가진듯한 느낌을 준다.

지금같이 날로 먹으려 하는 상황에서는 URLSpan에 URL밖에 넘길 수 없기때문에 대상 패키지 이름이나 컴포넌트 지정도 불가능하다.

그래서 한번 더 엎으러 가려고 합니다. 그럼 이만…

왜 URL의 스킴이 패키지 이름이죠

구글 플레이 스토어에 intent: 받는 앱들 널림. 아마. 그래서 악의적으로 가로채려고 하지 않는 이상 패키지 이름을 쓰면 바로 DummyActivity가 호출될거라서임.

액티비티 하나 더 띄우면 잔상 안남나요

onCreate() 에서 setContentView() 안해줘서 괜찮음. finish() 하니까 액티비티 스택에도 안남음. onCreate() 에서 저렇게 하는건 널리 알려진 패턴임. Activity 이외에 저걸 받을 수 있는 방법이 애최 있지도 않음.


Mar 10

Feb 19

앞으로 글을 인용할때는 링크나 인용 형식으로 쓰고 리블로그는 하지 말아야겠다. 리블로그나 좋가요 내역이 모두 섞이니 이건 뭐… 애최 리블로그는 “니부타니마지텐시!” “ㅇㄱㄹㅇ” 같은거나 달아서 올리라고 만들어진듯.



Feb 17

Feb 8
방 참 더럽다…

기프트박스를 받아야겠으니 알파스캔에서 내놓은 AOC 2769 I2769VM 리뷰를 씀. 쓰기만 하면 주는거니 명시했다고 안주진 않겠지…

제원은 다나와같은데서 보면 있는데 각잡고 표기할 이유가 없음. 27인치 IPS패널에 MHL과 DisplayPort를 지원함. MHL과 DP를 지원하는 모니터 중 27인치중에서 제일 쌈.

장점

크고 쌈.
베젤이 얇음.
HDMI 2 DisplayPort 1 D-SUB 1
DDC/CI 지원으로 VGA가 지원하면 컴퓨터에서 모니터 설정 가능.
VESA홀 있음. 덕분에 기프트박스에 스탠드 주는거 끼워서 180도 피봇해서 와식 생활을 즐길수있음.
단점

모니터 OSD에 뭘바라겠냐만 조작이 굼뜨고 후짐. DDC/CI 있어서 다행.
사정상 HDMI-DVI 케이블을 써야할때가 있는데 오디오 케이블을 연결해도 무조건 D-SUB전용임.
커서 애X플러스에서 720p애니 보는데 후져보임.
기타

MHL보고 샀는데 내가 쓰는 Nexus 5나 Nexus 7 (2013)은 모두 Slimport를 씀. ㅋㅋㅋㅋㅋㅋ ㅠㅠㅠ.

보내준 케이블 문제인지 내 몇년묵은 HD5750 문제인지 모니터 문제인지 DisplayPort로 연결시 특정 해상도만 지원함. 문제는 1920×1080이 안됨.

아무튼 누워서 드래곤즈크라운 하니까 좋다.

방 참 더럽다…

기프트박스를 받아야겠으니 알파스캔에서 내놓은 AOC 2769 I2769VM 리뷰를 씀. 쓰기만 하면 주는거니 명시했다고 안주진 않겠지…

제원은 다나와같은데서 보면 있는데 각잡고 표기할 이유가 없음. 27인치 IPS패널에 MHLDisplayPort를 지원함. MHL과 DP를 지원하는 모니터 중 27인치중에서 제일 쌈.

장점

  • 크고 쌈.
  • 베젤이 얇음.
  • HDMI 2 DisplayPort 1 D-SUB 1
  • DDC/CI 지원으로 VGA가 지원하면 컴퓨터에서 모니터 설정 가능.
  • VESA홀 있음. 덕분에 기프트박스에 스탠드 주는거 끼워서 180도 피봇해서 와식 생활을 즐길수있음.

단점

  • 모니터 OSD에 뭘바라겠냐만 조작이 굼뜨고 후짐. DDC/CI 있어서 다행.
  • 사정상 HDMI-DVI 케이블을 써야할때가 있는데 오디오 케이블을 연결해도 무조건 D-SUB전용임.
  • 커서 애X플러스에서 720p애니 보는데 후져보임.

기타

MHL보고 샀는데 내가 쓰는 Nexus 5Nexus 7 (2013)은 모두 Slimport를 씀. ㅋㅋㅋㅋㅋㅋ ㅠㅠㅠ.

보내준 케이블 문제인지 내 몇년묵은 HD5750 문제인지 모니터 문제인지 DisplayPort로 연결시 특정 해상도만 지원함. 문제는 1920×1080이 안됨.

아무튼 누워서 드래곤즈크라운 하니까 좋다.


Feb 6

Continuous Failure

  • <__khris__> 어디 쥐구멍에 숨고싶다
  • <M***> 왜 부끄러
  • <__khris__> 똥같은거만들어서
  • <M***> 하루이틀임?
  • <__khris__> !!

Jan 22

농심 유루유리


Jan 19

전부터 생각하던 오프닝(땀)


Dec 11

햄버거 버튼? 석삼 버튼!

generalapps:

img source from craigmod.com

물론, 저 혼자 쓰는 단어입니다.

나만 쓰는 단어인줄 알았는데 다른 사람도 쓰는구나…


Page 1 of 31