web-dev-qa-db-fra.com

Comment changer par programme la couleur principale dans Android L

Est-il possible de changer les couleurs primaires par programme? Je voudrais le faire dans le code en fonction de l'écran/état de l'application.

Actuellement, je ne peux définir que les couleurs du thème (statique):

    <item name="Android:colorPrimary">@color/primary_color</item>
    <item name="Android:colorPrimaryDark">@color/dark_color</item>
    <item name="Android:colorBackground">@Android:color/white</item>
    <item name="Android:colorAccent">@color/primary_color</item>
    <item name="Android:colorControlHighlight">@color/primary_color</item>

Merci

13
ebtokyo

Vous pouvez bien entendu implémenter des sous-classes personnalisées de View dotées de méthodes de définition des couleurs. 

Vous pouvez également définir plusieurs thèmes avec vous, différents schémas de couleurs. 

Views recherche des informations sur le thème à partir du contexte lors de leur création. Donc, pour changer les styles appliqués à partir d'un thème, vous devrez recréer votre hiérarchie de vues avec un contexte utilisant le bon thème. 

Une façon de le faire est de créer un nouveau ContextThemeWrapper puis d'obtenir un LayoutInflator qui utilise ce wrapper de thème, de supprimer l'ancienne version de votre mise en page et de la gonfler.

Grossièrement:

    ContextThemeWrapper themeWrapper = new ContextThemeWrapper(this, R.style.AppThemeWithColorScheme2);
    LayoutInflater layoutInflater = LayoutInflater.from(themeWrapper);
    viewContainer.removeAllViews();
    layoutInflater.inflate(R.layout.my_layout, viewContainer, true );

Si vous utilisez la barre d’action, cela risque d’être un peu plus compliqué, car elle est créée une fois par activité .

10
yogurtearl

UTILISEZ ce code pour définir toolbarcolor et la barre d'état (couleur de la barre d'outils plus sombre) 

toolbar.setBackgroundColor(toolbarColor);
factor=0.8f; 
int a = Color.alpha(toolbarcolor);
int r = Math.round(Color.red(toolbarcolor) * factor);
int g = Math.round(Color.green(toolbarcolor) * factor);
int b = Math.round(Color.blue(toolbarcolor) * factor);
int statusColor=Color.argb(a,
        Math.min(r, 255),
        Math.min(g, 255),
        Math.min(b, 255));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    Window window = MainActivity.this.getWindow();
    window.setStatusBarColor(statusColor);
}
0
Vaishali Malviya