2011-01-24 17 views
12

ListView'de sahip olduğum CheckedTextView öğelerinde "android: checkMark" özniteliğini programlı olarak ayarlamaya çalışıyorum. Başvurumu çalıştırırken aşağıdaki özel durum alıyorum:

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

ID # 0x101021a ile kaynak tekabül aynen seni CheckedTextView için geçirerek değerdir android.R.attr.listChoiceIndicatorMultiple, için:

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

Java'dan bunu yapmanın yolu bu değil mi? Ben XML düzeni istenilen davranışı tetiklemek için çalıştı (ve başarılı):

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

şey olması gerektiği eğer derleme zamanında bilmek kalmamasıdır

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

veya

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

Bu nedenle, bu değerleri çalışma zamanında ayarlamalıyım. Bunu programlı bir Drawable referans yerine bir nitelik başvuru ayarlayarak tahmin ediyorum

+0

teşekkürler! Bu, bugün sahip olduğum bir sorunla çok yardımcı oldu. – Chris

+0

@Chris: Rica ederim :-) – dbm

cevap

26

sorundur.

Bu durumda, android.R.attr.listChoiceIndicatorMultiplecorresponds toandroid.R.drawable.btn_check, bunun yerine bunu ayarlamayı deneyebilirsiniz.


Veya, özelliklerini alamazlarsa, dinamik Drawable değerini almak için TypedArray üzerinde getDrawable() diyebiliriz.

Düzenleme:
listChoiceIndicatorMultiple değeri cari tema üzerinde bağlı olduğundan, başvuru sorununu çözme yönünde tema sormak gerekir:

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

drawables önbelleğe yerine performans emin olun ListView'unuzdaki her öğe için bu manevra.

Bu sadece çok basit bir örnektir, ancak varsayılan tema ile çalışır. Özel bir temanız varsa tam olarak attrs'u çözmek için ne yapılması gerektiğinden emin değilim.

+0

Oh üzgün haklısın. Benim hatam. – Beasly

+1

Bu gerçekten çok iyi bir cevaptır (çünkü o yoldan yürüdüğümden beri :-), ancak "android.R.drawable.btn_check" çekilemez.Dosya sistemine göz atarsam gerçekten buluyorum ("[path_to_android_SDK]/platformlar/android-9/data/res/drawable" klasöründe bulunuyor ve bu bir XML dosyasıdır), ancak kodumu buna göre yazarken derleme hatalarım olur "btn_check çözümlenemiyor veya geçerli bir alan değil" den şikayet ediyor. – dbm

+0

Diğer öneri ("getDrawable()" ile ilgili olan), ancak benim için yeni. Bu konuda biraz "ödev" yapmak zorunda kalacağım, çünkü daha önce böyle bir manevra yapmadım :-) – dbm

0

AppCompat kitaplığını kullanarak basit olsaydı alternatifler olacaktır:

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

ya:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material); 
İlgili konular