[Android] 맨날 까먹지? 키보드 감추기

안드로이드에서 키보드로 입력하고 검색 버튼을 누르면, 당근 빳따~ 키보드를 감춰주시는 센스를 발휘해야 하는데… 바로 그 코드는 아래와 같3.

InputMethodManager Imm = 
    (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
Imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

단, 현재 Focus된 뷰가 없을 경우 넉다운될 수 있으니, getCurrentFocus()의 결과값이 null인지를 체크할 것.

안드로이드 하위 버전에서 ColorDrawable의 getColor 미지원에 대한 해결책

안드로이드 하위 버전 즉, API Level 11 이전에서는 ColorDrawable의 getColor 함수가 지원되지 않습니다. Color에 대한 Drawable인 ColorDrawable에서 getColor가 지원되지 않는다는 것이 참으로 이상하지만 여하튼 API Level 11에서는 지원하지 않습니다. API Level 11 이전이라면 안드로이드 2.0 버전대입니다. 진저브레드였던가..

이리하여 ColorDrawable 클래스의 getColor를 사용할 경우 진저브레드와 같은 단말기는 지원할 수 없습니다. 그렇다면 진저브레드와 같이 API Level 11 이전의 단말기도 지원하면서 ColorDrawable의 getColor를 대체할 수 있는 함수는 어떻게 될까요?

쉬울것 같지만, 그 방법을 좀처럼 찾을 수 없었는데.. 편법이지만 명확한 방법을 공유합니다. 바로 그려보고 직접 확인해 보는 방식인데요. ColorDrawable은 Canvas에 무엇가를 그릴 수 있으므로 직접 그려보고 그린 내용을 확인한다는 것입니다. 즉, Bitmap에 그려보고 Bitmap의 Pixel 값을 가져오면, 바로 그 값이 우리가 원하는 값입니다. 코드는 다음과 같습니다.

int getColor(ColorDrawable cb)
{
    Bitmap bitmap = Bitmap.createBitmap(1, 1, Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap); 
    cb.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    cb.draw(canvas);

    int clr = bitmap.getPixel(0, 0);
    bitmap.recycle();

    return clr;
}

어차피 그리기만 하면 되므로 비트맵의 크기는 1×1로 하였습니다. 그리고 투명도에 대한 알파값까지 고려하기 위해서 비트맵의 색상 포맷은 ARGB_8888, 즉 32Bits로 하였습니다. 색상값 하나를 얻기 위해 비트맵까지 생성해야 하는 방법까지 동원해야 한다는 점이 걸리기는 하지만 성공적으로 잘 됩니다.

[Android] 맨날 까먹는 runOnUiThread 사용예

통신을 통해 데이터를 스레드를 통해 딱… 가져오고 난 후 동일한 스레드에서 바로 Spinner 등과 같은 UI에 데이터를 설정하시면 우에엑~~ 하고 구토를 하시는 안드로이드님.

UI 단에 데이터를 설정할 수 있는 권한은 오직 UI 스레드, 즉 메인 스레드만이 하실 수 있는 전지전능하신 권한이므로 감히 자식 스레드에서는 기도를 통해 소원을 빌어야 합니다. 안드로이드님께서는 이러한 기도를 runOnUiThread라는 Context의 매서드를 통해 가능하게 하옵시고..

아래와 같은 예제를 통해 기도 방법을 메모하고자 합니다.

String strJSON = event.getResultJSON();

if(strJSON != null) {
    if(event.getRequestId().compareTo("행정구") == 0) {
        JSONArray array = (JSONArray)JSONValue.parse(strJSON);
        Iterator iter = array.iterator();
				
        final ArrayList list = new ArrayList();
        
        while(iter.hasNext()) {
            JSONObject obj = (JSONObject)iter.next();
            Set keySet = obj.keySet();
            Iterator keyIter = keySet.iterator();
            while(keyIter.hasNext()) {
            Object key = keyIter.next();
            Object val = obj.get(key);
            list.add(val);
        }
    }	
				
    Collections.sort(list);
				
    this.runOnUiThread(
        new Runnable() {
            @Override
            public void run() {
                Spinner spGuName = (Spinner)findViewById(R.id.spGuName);
                ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(
                    ActivitySearchLocation.this, 
                    R.layout.custom_simple_dropdown_item_1line, list.toArray()
                );
                spGuName.setAdapter(adapter);						
            }
        });
    }
}

위의 코드는 데이터를 가져오는 통신 스레드에서 실행되는 코드이고 23번째 줄이 바로 ‘기도’에 해당합니다. 정작 중요한 내용보다 부수적인 내용이 더 많은 코드이지만.. 나중을 위해 Keep 해 둡니다. 참고로 가져온 데이터를 배열로 저장하고 이를 Collections 클래스의 정적 함수인 sort를 통해 정렬하고 있습니다.

[Andorid] 항상 까먹는 Spinner 항목값 설정

안드로이드는 뭐 하나 하려면 제법 손이 많이 갑니다.. 스피너에 항목값 리스트를 할당하는 것도 다른 툴에 비해 갑절이나 많은 코드를 작성해야 합니다.

String[] facilityList = { 
    "공급배관", "사용자배관", "공급밸브", "정압기", "테스트박스", 
    "로케이트박스", "정류기", "배류기", "수취기", "검지공" 
};
		
Spinner spFacilityType = (Spinner)findViewById(R.id.spFacilityType);
ArrayAdapter<string> adapter = new ArrayAdapter<string>(
    this, 
    android.R.layout.simple_spinner_dropdown_item, 
    facilityList);
spFacilityType.setAdapter(adapter);
spFacilityType.setSelection(0);

그런데 말입니다… 이렇게 해서 만들어진 스피너의 생김새가 다소 촌스럽습니다. 바로 아래처럼…

사용자 삽입 이미지

표시되는 항목들의 높이가 너무 높아 보이지 않나요? 이 항목의 높이값을 조절하기 위해 위의 코드 중 9번줄의 코드를 변경했는데 전체 코드를 다시 보면 다음과 같습니다.

String[] facilityList = { 
    "공급배관", "사용자배관", "공급밸브", "정압기", "테스트박스", 
    "로케이트박스", "정류기", "배류기", "수취기", "검지공" 
};
		
Spinner spFacilityType = (Spinner)findViewById(R.id.spFacilityType);
ArrayAdapter<string> adapter = new ArrayAdapter<string>(
    this, 
    R.layout.custom_simple_dropdown_item_1line, 
    facilityList);
spFacilityType.setAdapter(adapter);
spFacilityType.setSelection(0);

결과는 다음과 같습니다

사용자 삽입 이미지

이를 위해 여기서 추가한 리소스가 하나 있습니다. 바로 custom_simple_dropdown_item_1line.xml인데요. 그 내용은 다음과 같습니다.



이상 맨날 까먹어 고생하는 코드를 정리해 보았습니다.