2011-01-24 11 views
12

Sto tentando di impostare l'attributo "android: checkMark" sugli elementi di CheckedTextView che ho in un ListView. Quando si esegue la mia applicazione ottengo la seguente eccezione:

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

La risorsa con ID # 0x101021a corrisponde a android.R.attr.listChoiceIndicatorMultiple, che è esattamente il valore sto passando al mio CheckedTextView:

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

Non è questo il modo di farlo da Java? Ho cercato (e riuscito) per innescare il comportamento desiderato dal layout XML:

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

Il fatto è che io non so al momento della compilazione se dovrebbe essere

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

o

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

Quindi, ho bisogno di impostare questi valori in fase di esecuzione.

+0

Grazie! Questo mi ha aiutato molto con un problema che ho avuto oggi. – Chris

+0

@Chris: Prego :-) – dbm

risposta

26

Direi che a livello di codice l'impostazione di un riferimento ad attributo piuttosto che un riferimento Drawable è il problema.

In questo caso, android.R.attr.listChoiceIndicatorMultiplecorresponds toandroid.R.drawable.btn_check, quindi è possibile provare a impostarlo.


O, se è possibile ottenere gli attributi, si potrebbe chiamare getDrawable() sul TypedArray per recuperare dinamicamente il valore Drawable.

Edit:
Poiché il valore di listChoiceIndicatorMultiple dipende dal tema corrente, è necessario chiedere al tema corrente per risolvere il riferimento:

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

Assicurarsi di memorizzare nella cache i drawable, piuttosto che l'esecuzione questa manovra per ogni oggetto nel tuo ListView.

Questo è solo un esempio di base, ma funziona con il tema predefinito. Non sono esattamente sicuro di cosa si debba fare per risolvere completamente attrs se si dispone di un tema personalizzato.

+0

Oh scusa, hai ragione. Colpa mia. – Beasly

+1

Questa è davvero una buona risposta (dal momento che ho già imboccato quella strada :-), tuttavia, sembra che non ci sia alcun "android.R.drawable.btn_check" disegnabile.Se sfoglio il file system lo trovo davvero (è nella cartella "[path_to_android_SDK]/platforms/android-9/data/res/drawable" ed è un file XML), ma quando scrivo il mio codice di conseguenza ottengo errori di compilazione lamentarsi del fatto che "btn_check non può essere risolto o non è un campo valido". – dbm

+0

L'altro suggerimento (quello su "getDrawable()") è, comunque, nuovo per me. Dovrò fare alcuni "compiti" su quello, anche se non ho mai fatto una manovra prima :-) – dbm

0

Se si utilizza la libreria appcompat alternative semplici sarebbero:

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

o:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material); 
Problemi correlati