2015-09-02 5 views
16

Sto riscontrando un problema qui. Ho appena aggiornato da sdk 22 a 23 e la versione precedente di "getColorStateList()" è stata dichiarata obsoleta.getColorStateList è stato ritirato

Il mio codice è stato come questo

seekBar.setProgressTintList(getResources().getColorStateList(R.color.bar_green)); 
valorslide.setTextColor(getResources().getColorStateList(R.color.text_green)); 

Il più vecchio "getColorStateList" era

getColorStateList(int id) 

E nuovo è

getColorStateList(int id, Resources.Theme theme) 

Come posso utilizzare la variabile Tema? Grazie in anticipo

risposta

22

L'oggetto Tema è il tema utilizzato per definire l'elenco degli stati dei colori. Se non si utilizza alcuna tematizzazione speciale con risorse individuali, è possibile passare null o il tema corrente come segue:

TextView valorslide; // initialize 
SeekBar seekBar; // initialize 
Context context = this; 
Resources resources = context.getResources(); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
    seekBar.setProgressTintList(resources.getColorStateList(R.color.bar_green, context.getTheme())); 
    valorslide.setTextColor(resources.getColorStateList(R.color.text_green, context.getTheme())); 
} else { 
    seekBar.setProgressTintList(resources.getColorStateList(R.color.bar_green)); 
    valorslide.setTextColor(resources.getColorStateList(R.color.text_green)); 
} 

Se non non si preoccupano del tema, si può semplicemente passare null :

getColorStateList(R.color.text_green, null) 

See the documentation for more explanation. nota, avete solo bisogno di usare la nuova versione sul API 23 (Android Marshmallow) e superiori.

+2

Oppure, solo bastone con la versione deprecata, come a meno che il 'minSdkVersion' è 23 o superiore, è necessario utilizzare la versione deprecata sui vecchi dispositivi in ​​ogni caso. – CommonsWare

+0

@CommonsWare avrei dovuto indicarlo, aggiornato per riflettere quell'informazione. Grazie. – anthonycr

+0

Ho provato null prima e si è bloccato. Ho provato entrambe le cose ora (null e getTheme()), e si blocca ancora '14635-14635/golden.imper.csystemhelper E/MessageQueue-JNI: java.lang.NoSuchMethodError: Nessun metodo virtuale getColorStateList (ILandroid/content/res/Risorse $ a tema;) Landroid/content/res/Co lorStateList; in classe Landroid/content/res/Resources; o le sue super classi (la dichiarazione di 'android.content.res.Resources' appare in /system/framework/framework.jar) ' – fkchaud

36

Mentre la risposta di anthonycr funziona, è molto più compatto di scrivere solo

ContextCompat.getColorStateList(context, R.color.haml_indigo_blue); 
+1

Funziona alla grande! C'è qualcosa di simile, ma per i metodi di ricerca? Ho problemi di compatibilità (risolti con la risposta di anthony) con 'seekBar.setProgressTintList()' (Non ho davvero bisogno di questo, è per conoscenza) – fkchaud

+1

Questo dovrebbe essere accettato come risposta :) – Rajesh

+0

come può rendere 'ColorStateList' da un colore personalizzato e non dal colore della risorsa? –

0

È necessario utilizzare ContextCompat.getColor(), che fa parte della V4 libreria di supporto (in modo da funzionare per tutti la precedente API).

ContextCompat.getColor(context, R.color.my_color) 
Problemi correlati