태그 보관물: Titanium

[Titanium] 텍스트 내부의 링크 클릭 가능하도록 하기

라벨에서 텍스트속의 http://… 와 같은 하이퍼링크나 010-1111-1111 같은 전화번호를 터치로 선택하여 열거나 전화를 걸 수 있도록 하는 방법이다.

OS상의 제한인지는 모르겠지만 iOS에서는 TextArea에서, 안드로이드에서는 Label에서만 적용이 가능하다.

Android의 경우

textView =  Ti.UI.createLabel({
	left: '0dp',
	right: '0dp',
	top: '0dp',
	height: Ti.UI.SIZE,
	text: 'Text',
	autoLink : Ti.UI.Android.LINKIFY_ALL
});

iOS의 경우

textView =  Ti.UI.createTextArea({
	left: '0dp',
	right: '0dp',
	top: '0dp',
	height: Ti.UI.SIZE,
	value: 'Text',
	autoLink : Ti.UI.AUTODETECT_ALL,
	editable : false
});

Titanium android에선 테두리가 검은 이미지를 9-patch로 인식

Titanium의 안드로이드 지원은 꽤나 후진편인데,

검은색 이미지를 사용할 경우 이런 에러가 나오는 것을 볼 수 있다.(2.0.2 GA 기준)

06-07 16:56:04.507: E/TiApplication(2738): (KrollRuntimeThread) [438,440] APP PROXY: ti.modules.titanium.app.AppModule@413ba7f8
06-07 16:56:14.105: E/TiApplication(2738): (main) [1156,8379] Sending event: exception on thread: main msg:java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0; Titanium 2.0.2,2012/05/30 10:21,2ff31a3
06-07 16:56:14.105: E/TiApplication(2738): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
06-07 16:56:14.105: E/TiApplication(2738): 	at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
06-07 16:56:14.105: E/TiApplication(2738): 	at java.util.ArrayList.get(ArrayList.java:304)
06-07 16:56:14.105: E/TiApplication(2738): 	at org.appcelerator.titanium.util.TiNinePatchHelper.createChunk(TiNinePatchHelper.java:189)
06-07 16:56:14.105: E/TiApplication(2738): 	at org.appcelerator.titanium.util.TiNinePatchHelper.process(TiNinePatchHelper.java:52)
06-07 16:56:14.105: E/TiApplication(2738): 	at org.appcelerator.titanium.util.TiFileHelper.loadDrawable(TiFileHelper.java:308)
06-07 16:56:14.105: E/TiApplication(2738): 	at org.appcelerator.titanium.util.TiUIHelper.buildBackgroundDrawable(TiUIHelper.java:493)
06-07 16:56:14.105: E/TiApplication(2738): 	at org.appcelerator.titanium.view.TiUIView.handleBackgroundImage(TiUIView.java:783)
06-07 16:56:14.105: E/TiApplication(2738): 	at org.appcelerator.titanium.view.TiUIView.processProperties(TiUIView.java:562)
06-07 16:56:14.105: E/TiApplication(2738): 	at ti.modules.titanium.ui.widget.TiView.processProperties(TiView.java:39)
...

로컬 이미지 리소스를 불러올때에 9-patch 이미지인지 확인을 하면서

이미지 테두리가 투명과 검은색으로만 이루어져있으면 9-patch로 인식을 하도록 하는 병맛스러운 코드가 있다.

테두리가 모두 투명하면 9-patch로 인식하지 않도록 하는 방어코드(?)가 있으니 피하려면 테두리를 모두 투명하게 하거나 검은색에서 약간 투명한 색을 사용하면 될듯하다;

그런데 애초에 .9.png가 아니면 9-patch로 인식을 할 필요가 있을까?

[팁] 터치이벤트가 여러번 발생할수 있음에 주의!

티타늄에서는 btn.addEventListener(‘click’, listener) 와 같은 형식으로 이벤트리스너를 등록하여 터치 이벤트를 처리하는데,
버튼을 여러번 누르게되면 이벤트 queue에 쌓여서 listener가 착실하게 여러번 호출이 된다.
어찌보면 당연한 이야기인데 이걸로 인해 처리에 시간이 걸리는 네트워크 작업의 경우 ‘보내기’ 버튼이 여러번 호출되어 똑같은 글이 여러번 올라가는 현상이 발생할 수 있다.

이걸 해결하기 위해 간단하게 boolean 변수를 만들어 listener안에서 처리중일때 true로 바꾸고 이미 true이면 처리를 하지 읺게끔 하였다.
멀티스레드 환경이라면 thread lock을 해야겠지만 자바스크립트는 싱글 스레드로 동작하기 때문에 저렇게 처리를 하면 될 듯하다.