오늘의 삽질 – 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에서는 키보드를 보여주지 않는 듯하니 참고하길

‘트럭’ Surface은 ‘스포츠카’ iPad와 경쟁할 수 없다

Analyst: Surface ‘Truck’ Can’t Compete With iPad ‘Sports Car’

The firm compared Apple’s iPad the “Tesla sports car of the computing world, a product that delivers speed in style but only on smooth roads”. In contrast, Microsoft’s Surface was compared to “well designed, but traditional sports utility vehicle that can haul boats and climb a hill of rocks.” The firm said that it doubts that “consumers will trade sports cars for trucks.”

애널리스트 그룹 Yankee에서 iPad부드러운 도로위에서 뿐이지만 속도를 스타일있게 제공하는 스포츠카 같은 존재이이며 Microsoft Surface배를 끌며 산도 넘나들 수 있는 잘 디자인된 전통적인 SUV와 같다고 비교.
그렇지만 사용자들이 스포츠카를 트럭으로 교환할지에 대해서는 의문을 가진다고 말했댄다.

스포츠와 트럭, 적절한 비유같이 느껴진다.

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로 인식을 할 필요가 있을까?

BeenTogether. 사랑한지