android.content.res.Resources $ NotFoundException quando programmazione impostazione android.R.attr.listChoiceIndicatorMultiple

StackOverflow https://stackoverflow.com/questions/4783002

Domanda

Sto cercando di impostare il livello di codice "android: segno di spunta" attributo articoli CheckedTextView che ho in un controllo 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 per 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 deve essere

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

o

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

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

È stato utile?

Soluzione

Direi che l'impostazione di programmazione di un di attributo di riferimento piuttosto che una Drawable di riferimento è il problema.

In questo caso, android.R.attr.listChoiceIndicatorMultiple corrisponde a android.R.drawable.btn_check, così si potrebbe provare a impostare che, invece.


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

Modifica
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 le drawable, piuttosto che l'esecuzione di questa manovra per ogni articolo nel tuo ListView.

Questo è solo un esempio molto semplice, ma funziona con il tema di default. Io non sono esattamente sicuro di cosa deve essere fatto per risolvere attrs completamente se si dispone di un tema personalizzato.

Altri suggerimenti

Se si utilizza il AppCompat alternative semplici biblioteca potrebbe essere:

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

o

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material);  
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top