카테고리 보관물: 쓸모있는 정보

오늘의 삽질 – AlertDialog의 EditText에 키보드 보여주기

AlertDialog에 넣었던 EditText에서 포커스는 가있어도 소프트웨어 키보드가 나타나지 않는 증상이 있어서
구글링을 통해 온갖 키보드를 나타내기 위한 시도를 하였다.

final View innerView = View.inflate(MainActivity.this, R.layout.name_edit_popup, null);
final EditText editText = (EditText)innerView.findViewById(R.id.nameEdit);
 
final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
	.setCustomTitle(innerView)
	.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
 
		@Override
		public void onClick(DialogInterface dialog, int which) {
			// something
		}
	}).create();
 
// 시도 1
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
 
// 시도 2
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});
 
// 시도 3
dialog.setOnShowListener(new OnShowListener() {
 
    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});
 
dialog.show();

그런데도 키보드가 나타나지 않아서 멘붕하고 있었는데…


...
final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
.setCustomTitle(innerView)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
...

setView가 아니라 setCustomTitle을 사용하고 있었음을 발견하였다…

CustomTitle에 넣은 EditText에서는 키보드를 보여주지 않는 듯하니 참고하길

iOS앱에 커스텀 폰트 사용하기

iOS 3.2부터 앱에 커스텀 글꼴을 포함시킬 수 있습니다.

폰트를 넣는 방법을 살펴보도록 하겠습니다.

1. 폰트파일(ttf나 otf)을 프로젝트 리소스에 추가합니다.

 

2. Info.plist 파일에 Add row로 ‘Fonts provided by application’라는 항목을 추가하고 그 아래에 String 항목으로 폰트 파일 이름을 추가합니다. (위에서 추가한 파일의 이름과 확장자를 그대로 입력해야 합니다.)

 

3. 앱 설치시 폰트가 같이 설치되도록 프로젝트 Targets의 Build Phases의 Copy Bundle Resources에 추가해줍니다.

 

4. 소스에서 UIFont로 읽어오려면 폰트의 이름을 알아야합니다. 폰트의 이름은 Finder에서 ‘정보 가져오기’로 확인할 수 있습니다.

또는 앱에서 인식한 모든 폰트들의 정보를 출력해서 확인할 수 있습니다.

for(NSString *familyName in [UIFont familyNames])
        NSLog(@"%@ : [ %@ ]",familyName,
              [[UIFont fontNamesForFamilyName:familyName] description]);

 

 

5. 위에서 알아낸 이름으로 UIFont를 얻어와서 UILabel 등에 설정해서 사용하시면 됩니다.

 self.dateLabel.font = [UIFont fontWithName:@"Nanum Pen Script OTF" size:self.dateLabel.font.pointSize];

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을 해야겠지만 자바스크립트는 싱글 스레드로 동작하기 때문에 저렇게 처리를 하면 될 듯하다.