2011-01-24 2 views
12

프로그래밍 방식으로 ListView에있는 CheckedTextView 항목에 "android : checkMark"특성을 설정하려고합니다. 내 응용 프로그램을 실행할 때 나는 다음과 같은 예외가 :android.content.res.Resources 프로그래밍 방식으로 설정할 때 NotFoundException이 발생합니다. android.R.attr.listChoiceIndicatorMultiple

android.content.res.Resources$NotFoundException: Resource ID #0x101021a 

ID 번호의 0x101021a와 자원은 해당 정확히 내 CheckedTextView에 전달하고있는 값입니다 android.R.attr.listChoiceIndicatorMultiple, 에 :

mCheckedTextView.setCheckMarkDrawable(android.R.attr.listChoiceIndicatorMultiple) 

Java에서이를 수행하는 방법이 아닙니까? 나는 XML 레이아웃에서 원하는 동작을 실행하는 데 노력 (및 성공) :

<CheckedTextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
    android:id="@android:id/text1" /> 

것은 그것이 있어야 만약 내가 컴파일 타임에 알 수 없다는 것입니다

android:checkMark="?android:attr/listChoiceIndicatorMultiple" 

또는

android:checkMark="?android:attr/listChoiceIndicatorSingle" 

따라서 런타임에이 값을 설정해야합니다. 내가 그 프로그래밍 Drawable 참조보다는 속성 참조를 설정 거라 생각

+0

감사합니다! 그것은 제가 오늘날 가지고있는 문제에 많은 도움이되었습니다. – Chris

+0

@Chris : 환영합니다 :-) – dbm

답변

26

문제입니다.

이 경우 android.R.attr.listChoiceIndicatorMultiplecorresponds toandroid.R.drawable.btn_check이므로 대신 설정해보세요.


또는, 특성을 얻을 수 있다면, 당신은 동적으로 Drawable 값을 가져 오도록 TypedArraygetDrawable()를 호출 할 수 있습니다.

편집 :
listChoiceIndicatorMultiple의 값이 현재 테마에 의존하기 때문에, 당신은 참조 해결하기 위해 현재의 테마를 요청해야합니다

int[] attrs = { android.R.attr.listChoiceIndicatorMultiple }; 
TypedArray ta = getContext().getTheme().obtainStyledAttributes(attrs); 
Drawable indicator = ta.getDrawable(0); 
view.setCheckMarkDrawable(indicator); 
ta.recycle(); 

하면 드로어 블을 캐시보다는 수행해야합니다을 너의 ListView에있는 모든 항목에 대한이 책략.

아주 기본적인 예일 뿐이지 만 기본 테마에서 작동합니다. 사용자 지정 테마가있는 경우 attrs을 완전히 해결하기 위해 수행해야 할 작업을 정확히 알지 못합니다.

+0

오, 죄송합니다. 맞습니다. 내 잘못. – Beasly

+1

그건 정말 좋은 답변입니다. (이미 그 경로를 걸어 왔기 때문에 :-), 그러나 "android.R.drawable.btn_check"드로어 블이없는 것처럼 보입니다.내가 파일 시스템을 찾으면 참으로 찾는다. ("path_to_android_SDK/platforms/android-9/data/res/drawable"폴더에 있고 XML 파일이다.) 그러나 그에 따라 코드를 작성할 때 컴파일 오류가 발생한다. "btn_check을 확인할 수 없거나 유효한 필드가 아닙니다."라는 불평이 있습니다. – dbm

+0

그러나 다른 제안 ("getDrawable()"에 대한 제안)은 나에게 새롭다. 내가 전에 그런 기동을하지 않았기 때문에 나는 그 하나에 대해 "숙제"를해야 할 것이다 :-) – dbm

0

APPCOMPAT 라이브러리를 사용하는 경우 간단한 대안은 다음과 같습니다

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_check_material); 

나 :

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material); 
관련 문제