7월, 2013의 게시물 표시

리스트뷰, 체크박스, 그리고 체크 체인지 리스너

다음은 ListAdapter의 아이템 뷰를 가져오는 부분이다.

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.listitem, parent, false);
}
TextView txt1 = (TextView) convertView.findViewById(R.id.txt1);
TextView txt2 = (TextView) convertView.findViewById(R.id.txt2);
CheckBox chk1 = (CheckBox) convertView.findViewById(R.id.chk1);

IType type = (IType) getItem(position);
txt1.setText(type.getName(pref.isPreferUnicode()));

chk1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
((IType) getItem(position)).setHidden(!isChecked);
}
});
chk1.setChecked(!type.isHidden());

txt2.setText(type.getHalfStepString());

return convertView;
}

리스트 아이템의 레이아웃에 체크박스가 포함되어 있는데,
리스너 장착 부분과 체크 상태 설정 부분의 순서가 매우 중요하다. 파란 부분이다.
왜 그런 건진 알 수 없으나,
이 순서가 바뀌면 체크박스가 지 맘대로 작동한다.

리스트 뷰의 아이템에 체크박스가 있을 경우에 아이템 클릭이 안된다

예전에도 한 번 이 문제로 며칠을 끙끙댔던 기억이 나는데,
오늘 또 다시 이 문제로 몇 시간을 낑낑거렸으니 이번에는 필히 기록을 남겨두노라.

리스트 뷰의 아이템에 버튼이나 체크박스 같은 것이 들어 있으면 리스트 아이템 클릭이 안된다.
그러니, 디자인 단계에서 피할 수 있으면 피하라.
만일 피할 수 없었다면, 체크박스에 다음의 속성을 추가하라.

android:focusable="false"
android:focusableInTouchMode="false"

[참조]
http://stackoverflow.com/a/15859831

AudioFlinger could not create track, status -12

문제:
AudioFlinger could not create track, status: -12
Error creating AudioTrack

설명:
안드로이드 오디오 프레임워크는 한 번에 믹서 스레드 당 32개의 트랙(재생, 정지, 중단을 모두 포함해서)만 사용할 수 있다.
참고로, -12는 POSIX의 Not enough space 오류 코드이다.

해결:
이러한 문제를 해결하려면 백그라운드에서 실행 중인 오디오 리소스를 점유하고 있을 법한 앱을 죽이면 된다.

안드로이드 네트워크 연결 확인

간혹 광고 버전 앱을 쓰는 어느 얌체 같은 족속들이 지들 네트워크 데이터 쓰는 건 아까운지 인터넷을 끊어 놓고 쓴다. 이런 건 막아야 하지 않겠는가.

ConnectivityManager conMan 
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMan==null) NetworkInfo[] info = conMan.getAllNetworkInfo();
boolean connected = false;
for (NetworkInfo newtork : info) {
if (newtork!=null && newtork.isConnected()) {
connected = true; break;
}
}