Wie kann man die Primär- und Akzentfarbe in Android Lollipop wirklich programmgesteuert ändern?

156

Zunächst einmal diese Frage fragt eine sehr ähnliche Frage. Meine Frage hat jedoch einen subtilen Unterschied.

Ich möchte wissen, ob es möglich ist, das colorPrimaryAttribut eines Themas programmgesteuert in eine beliebige Farbe zu ändern .

So haben wir zum Beispiel:

<style name="AppTheme" parent="android:Theme.Material.Light">
    <item name="android:colorPrimary">#ff0000</item>
    <item name="android:colorAccent">#ff0000</item>
</style>

Zur Laufzeit entscheidet der Benutzer, dass er #ccffffals Primärfarbe verwenden möchte . Natürlich kann ich auf keinen Fall Themen für alle möglichen Farben erstellen.

Es macht mir nichts aus, wenn ich hackige Dinge tun muss, wie mich auf die privaten Interna von Android zu verlassen, solange es mit dem öffentlichen SDK funktioniert.

Mein Ziel ist es schließlich , die haben ActionBar und alle Widgets wie eine CheckBoxdieser Primärfarbe zu verwenden.

Nhaarman
quelle
1
Sie haben keine Ahnung, was "private Interna von Android" für eine nicht existierende Android-Version sind. Gehen Sie nicht davon aus, dass die "privaten Interna" von L die gleichen sind wie die für alles, was L in Bezug auf eine Produktionsfreigabe macht.
CommonsWare
Nein, Sie können keine beliebigen Daten in ein Thema einfügen. Das heißt, colorPrimary wird nur für den Hintergrund der Aktionsleiste, die Farbe der letzten Leiste und die Farbe der Benachrichtigungen verwendet, und Sie können all diese dynamisch ändern.
Alanv
2
Ich denke, Sie sollten fragen "Wie man das Stilattribut zur Laufzeit ändert", und was ich gesehen habe, ist die Antwort, dass Sie es nicht können. Ich habe jedoch eine Idee, die Ihnen helfen könnte. Verwenden Sie einen benutzerdefinierten ContextWrapper und stellen Sie eigene Ressourcen bereit. Schauen Sie sich das an: github.com/negusoft/holoaccent/blob/master/HoloAccent/src/com/… Insgesamt könnte Ihnen dieses Projekt eine Idee geben, wie das geht.
Mikooos
1
Hier nur ein Brainfarting, aber alles XML wird in .dex-Dateien konvertiert, die als Java-Objekte richtig in Ihre Android-Anwendung geladen werden. Bedeutet das nicht, dass wir in der Lage sein sollten, ganze Themen aus Code zu erstellen und festzulegen sowie das Thema aus einer Fabrik zu generieren, die noch geschrieben werden muss? Klingt nach viel Arbeit.
G_V
1
@NiekHaarman hast du jemals einen Weg gefunden?
Gbhall

Antworten:

187

Themen sind unveränderlich, können Sie nicht.

Chris Banes
quelle
8
Danke, Chris! Nicht die Antwort, nach der ich gesucht habe, aber ich denke, ich muss damit leben :)
Nhaarman
5
Hallo @ Chris Banes, aber wie hat die Kontakt-App die Farbe der Statusleiste und der Symbolleiste entsprechend der Themenfarbe des Kontakts geändert? Wenn es möglich ist, denke ich, dass Niek Haarmans Bedarf nicht zu weit ist, da er nur den Farbcode speichern muss, den der Benutzer möchte. Könnten Sie bitte mehr dazu erklären? Ich möchte auch so etwas kreieren, bin aber wirklich verwirrt damit.
Swan
39
Die Farbe der Statusleiste kann dynamisch über Window.setStatusBarColor () geändert werden.
Chris Banes
9
Ist es möglich, ein Thema programmgesteuert zu erstellen?
Andrew Orobator
3
Und während Sie die Farbe der Statusleiste dynamisch ändern, können Sie auch die Farbe der Navigationsleiste über Window.setNavigationBarColor () - API 21 :)
user802421
65

Ich habe die Kommentare zur Kontakt-App gelesen und wie sie für jeden Kontakt ein Thema verwendet.

Wahrscheinlich hat die Kontakt-App einige vordefinierte Themen (für jede Materialprimärfarbe von hier: http://www.google.com/design/spec/style/color.html ).

Sie können ein Thema vor der setContentView-Methode in der onCreate-Methode anwenden.

Dann kann die Kontakt-App jedem Benutzer zufällig ein Thema zuweisen.

Diese Methode ist:

setTheme(R.style.MyRandomTheme);

Diese Methode hat jedoch ein Problem, z. B. kann sie die Farbe der Symbolleiste, die Farbe des Bildlaufeffekts, die Farbe der Welligkeit usw. ändern, aber die Farbe der Statusleiste und der Navigationsleiste kann nicht geändert werden (wenn Sie sie auch ändern möchten).

Um dieses Problem zu lösen, können Sie die Methode vor und verwenden:

if (Build.VERSION.SDK_INT >= 21) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.md_red_500));
        getWindow().setStatusBarColor(getResources().getColor(R.color.md_red_700));
    }

Diese beiden Methoden ändern die Farbe der Navigations- und Statusleiste. Denken Sie daran, wenn Sie Ihre Navigationsleiste durchscheinend einstellen, können Sie ihre Farbe nicht ändern.

Dies sollte der endgültige Code sein:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTheme(R.style.MyRandomTheme);
    if (Build.VERSION.SDK_INT >= 21) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.myrandomcolor1));
        getWindow().setStatusBarColor(getResources().getColor(R.color.myrandomcolor2));
    }
    setContentView(R.layout.activity_main);

}

Sie können einen Schalter verwenden und eine Zufallszahl generieren, um zufällige Themen zu verwenden, oder wie in der Kontakt-App ist jedem Kontakt wahrscheinlich eine vordefinierte Nummer zugeordnet.

Ein Beispiel für ein Thema:

<style name="MyRandomTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/myrandomcolor1</item>
    <item name="colorPrimaryDark">@color/myrandomcolor2</item>
    <item name="android:navigationBarColor">@color/myrandomcolor1</item>
</style>

Entschuldigung für mein Englisch.

JavierSegoviaCordoba
quelle
1
Vielen Dank für Ihre Antwort. Leider war meine Bitte, eine beliebige Farbe zu verwenden. Natürlich ist es nicht möglich, Themen für alle Farben zu erstellen.
Nhaarman
1
@DanielGomezRico - AFAIK Sie können das voreingestellte Thema überschreiben, unabhängig davon, wo es ursprünglich eingestellt wurde - solange Sie es früh genug tun. In der Antwort heißt es: "Sie können ein Thema vor der setContentView-Methode in der onCreate-Methode anwenden."
ToolmakerSteve
50

Mit Theme.applyStyle können Sie Ihr Thema zur Laufzeit ändern, indem Sie einen anderen Stil darauf anwenden.

Angenommen, Sie haben diese Stildefinitionen:

<style name="DefaultTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/md_lime_500</item>
    <item name="colorPrimaryDark">@color/md_lime_700</item>
    <item name="colorAccent">@color/md_amber_A400</item>
</style>

<style name="OverlayPrimaryColorRed">
    <item name="colorPrimary">@color/md_red_500</item>
    <item name="colorPrimaryDark">@color/md_red_700</item>
</style>

<style name="OverlayPrimaryColorGreen">
    <item name="colorPrimary">@color/md_green_500</item>
    <item name="colorPrimaryDark">@color/md_green_700</item>
</style>

<style name="OverlayPrimaryColorBlue">
    <item name="colorPrimary">@color/md_blue_500</item>
    <item name="colorPrimaryDark">@color/md_blue_700</item>
</style>

Jetzt können Sie Ihr Thema zur Laufzeit wie folgt patchen:

getTheme().applyStyle(R.style.OverlayPrimaryColorGreen, true);

Die Methode applyStylemuss aufgerufen werden, bevor das Layout aufgeblasen wird! Wenn Sie die Ansicht nicht manuell laden, sollten Sie dem Thema Stile zuweisen, bevor Sie setContentViewIhre Aktivität aufrufen .

Dies kann natürlich nicht verwendet werden, um eine beliebige Farbe anzugeben, dh eine von 16 Millionen (256 3 ) Farben. Wenn Sie jedoch ein kleines Programm schreiben, das die Stildefinitionen und den Java-Code für Sie generiert, sollte so etwas wie eines von 512 (8 3 ) möglich sein.

Was dies interessant macht, ist, dass Sie verschiedene Stilüberlagerungen für verschiedene Aspekte Ihres Themas verwenden können. Fügen Sie colorAccentzum Beispiel einfach einige Overlay-Definitionen hinzu . Jetzt können Sie verschiedene Werte für Primärfarbe und Akzentfarbe fast willkürlich kombinieren .

Sie sollten sicherstellen, dass Ihre Overlay-Designdefinitionen nicht versehentlich eine Reihe von Stildefinitionen von einer übergeordneten Stildefinition erben. Beispielsweise AppTheme.OverlayRederbt ein Stil, der implizit aufgerufen wird, alle in definierten Stile, AppThemeund alle diese Definitionen werden auch angewendet, wenn Sie das Masterthema patchen. Vermeiden Sie also entweder Punkte in den Namen der Overlay-Themen oder verwenden Sie so etwas wie Overlay.Redund definieren Sie es Overlayals leeren Stil.

Devconsole
quelle
11
Versuchen Sie anzurufen, applyStylebevor Sie setContentViewIhre Aktivität anrufen, und es sollte funktionieren.
Devconsole
1
ja okai, dann könnte es funktionieren! Ich suche nach einer Möglichkeit, den Farbakzent in Fragment niveau nicht Aktivität zu ändern! Deshalb hat es bei mir leider nicht funktioniert: <Mein Anwendungsfall ist, dass ich beim Wechsel von Registerkarten, die ein anderes Fragment starten, unterschiedliche Farben für FAB- oder Registerkartenanzeigen haben möchte!
Dennis Anderson
Danke, das hat sehr geholfen! Ich kann es jedoch nicht mehrmals tun. (eine für colorPrimary, eine für colorAccent usw.). Kannst du mir helfen? Vielen Dank. stackoverflow.com/questions/41779821/…
Thomas Vos
1
Das ist die Art von Antwort, für die ich ein zweites Konto verwenden möchte, um noch einmal +1 zu erhalten. Vielen Dank.
Benoit Duffez
Vielen Dank, das war es, wonach ich gesucht habe ... Ich hoffe, ich kann die Akzentfarbe des aktuellen Themas mit diesem Ansatz ändern.
Nasib
32

Ich habe eine Lösung erstellt, um beliebige Farbthemen zu erstellen. Vielleicht kann dies für jemanden nützlich sein. API 9+

1. Erstellen Sie zuerst " res / values-v9 / " und legen Sie dort die folgende Datei ab: styles.xml und der reguläre Ordner "res / values" werden für Ihre Stile verwendet.

2. Fügen Sie diesen Code in Ihre Datei res / values ​​/ styles.xml ein:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">#000</item>
        <item name="colorPrimaryDark">#000</item>
        <item name="colorAccent">#000</item>
        <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    </style>

    <style name="AppThemeDarkActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">#000</item>
        <item name="colorPrimaryDark">#000</item>
        <item name="colorAccent">#000</item>
        <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    </style>

    <style name="WindowAnimationTransition">
        <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
        <item name="android:windowExitAnimation">@android:anim/fade_out</item>
    </style>
</resources>

3. in AndroidManifest:

<application android:theme="@style/AppThemeDarkActionBar">

4. Erstellen Sie eine neue Klasse mit dem Namen "ThemeColors.java".

public class ThemeColors {

    private static final String NAME = "ThemeColors", KEY = "color";

    @ColorInt
    public int color;

    public ThemeColors(Context context) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
        String stringColor = sharedPreferences.getString(KEY, "004bff");
        color = Color.parseColor("#" + stringColor);

        if (isLightActionBar()) context.setTheme(R.style.AppTheme);
        context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));
    }

    public static void setNewThemeColor(Activity activity, int red, int green, int blue) {
        int colorStep = 15;
        red = Math.round(red / colorStep) * colorStep;
        green = Math.round(green / colorStep) * colorStep;
        blue = Math.round(blue / colorStep) * colorStep;

        String stringColor = Integer.toHexString(Color.rgb(red, green, blue)).substring(2);
        SharedPreferences.Editor editor = activity.getSharedPreferences(NAME, Context.MODE_PRIVATE).edit();
        editor.putString(KEY, stringColor);
        editor.apply();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) activity.recreate();
        else {
            Intent i = activity.getPackageManager().getLaunchIntentForPackage(activity.getPackageName());
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            activity.startActivity(i);
        }
    }

    private boolean isLightActionBar() {// Checking if title text color will be black
        int rgb = (Color.red(color) + Color.green(color) + Color.blue(color)) / 3;
        return rgb > 210;
    }
}

5. Hauptaktivität:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new ThemeColors(this);
        setContentView(R.layout.activity_main);
    }

    public void buttonClick(View view){
        int red= new Random().nextInt(255);
        int green= new Random().nextInt(255);
        int blue= new Random().nextInt(255);
        ThemeColors.setNewThemeColor(MainActivity.this, red, green, blue);
    }
}

Um die Farbe zu ändern, ersetzen Sie einfach Random durch Ihr RGB. Ich hoffe, dies hilft.

Geben Sie hier die Bildbeschreibung ein

Es gibt ein vollständiges Beispiel: ColorTest.zip

IQ.Feature
quelle
Kannst du ein Projekt wie teilen?
Erselan Khan
Erstellen Sie ein neues Projekt, laden Sie die Datei "styles.xml" herunter und verwenden Sie den oben genannten Code. Viel Glück.
IQ.feature
1
Ich kann meinen Kopf nicht umwickeln. Können context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));Sie mir eine Erklärung oder einen Link geben, um dieses Thema weiterzuverfolgen?
Langusten Gustel
1
@ IQ.feature Ich denke, dass das Verschieben Ihres Codes zu Github Repo besser für das Teilen von Code geeignet ist
Vadim Kotov
1
Nur um für andere klar zu sein, weil ich darauf hereingefallen bin ... es gibt eine Datei res-v9 / styles.xml, die eine ganze Liste von Themen mit verschiedenen Farben deklariert, und der Code wendet im Wesentlichen eines dieser Themen an und erstellt die Aktivität neu. Es ist das, was auch andere Antworten versucht haben zu erreichen. Das heißt, es ist eine Problemumgehung, indem Themen vordefiniert werden und keine Themen programmgesteuert oder dynamisch erstellt werden.
Frezq
3

Ich habe den Dahnark-Code verwendet, muss aber auch den ToolBar-Hintergrund ändern:

if (dark_ui) {
    this.setTheme(R.style.Theme_Dark);

    if (Build.VERSION.SDK_INT >= 21) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.Theme_Dark_primary));
        getWindow().setStatusBarColor(getResources().getColor(R.color.Theme_Dark_primary_dark));
    }
} else {
    this.setTheme(R.style.Theme_Light);
}

setContentView(R.layout.activity_main);

toolbar = (Toolbar) findViewById(R.id.app_bar);

if(dark_ui) {
    toolbar.setBackgroundColor(getResources().getColor(R.color.Theme_Dark_primary));
}
lgallard
quelle
Fügen Sie diesen Code: android: background = "? attr / colorPrimary" zu Ihrer Symbolleiste (in der XML-Datei) hinzu, damit Sie den Hintergrund nicht in Java festlegen müssen.
JavierSegoviaCordoba
Aber ich habe zwei verschiedene Symbolleisten, eine für ein helles Thema und eine für ein dunkles Thema. Wenn ich den Android hinzufüge: background = "? Attr / colorPrimary", muss ich eine Art Selektor verwenden.
lgallard
Ich hatte viele Themen und benutze nur diesen Code. Schauen Sie sich diese App an: play.google.com/store/apps/…
JavierSegoviaCordoba
-1

Sie können die Farbe von colorPrimary nicht ändern, aber Sie können das Thema Ihrer Anwendung ändern, indem Sie einen neuen Stil mit einer anderen colorPrimary-Farbe hinzufügen

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>

<style name="AppTheme.NewTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorOne</item>
    <item name="colorPrimaryDark">@color/colorOneDark</item>
</style>

und innerhalb des Aktivitätsset-Themas

 setTheme(R.style.AppTheme_NewTheme);
 setContentView(R.layout.activity_main);
varghesekutty
quelle
Ich sehe, dass es bereits frühere Antworten gibt, die Schaltstile beschreiben. In welcher Situation ist Ihre Antwort angemessener als diese? Und um klar zu sein, lautet die Frage: "Zur Laufzeit entscheidet der Benutzer, dass er #ccffff als Primärfarbe verwenden möchte. Natürlich kann ich keine Themen für alle möglichen Farben erstellen." Dies löst dieses Bedürfnis nicht; Wenn jedoch niemand beschrieben hätte, wie dies zu tun ist, wäre es nützlich zu wissen.
ToolmakerSteve
-2

von einer Aktivität, die Sie ausführen können:

getWindow().setStatusBarColor(i color);
yeahdixon
quelle
2
Komisch, dass diese Antwort -8 Stimmen hat, aber mein Problem löst: D
Nabin Bhandari
-4

BENUTZEN SIE EINE WERKZEUGLEISTE

Sie können eine benutzerdefinierte Symbolleistenelementfarbe dynamisch festlegen, indem Sie eine benutzerdefinierte Symbolleistenklasse erstellen:

package view;

import android.app.Activity;
import android.content.Context;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.support.v7.internal.view.menu.ActionMenuItemView;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomToolbar extends Toolbar{

    public CustomToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
    }

    public CustomToolbar(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public CustomToolbar(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        ctxt = context;
    }

    int itemColor;
    Context ctxt;

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        Log.d("LL", "onLayout");
        super.onLayout(changed, l, t, r, b);
        colorizeToolbar(this, itemColor, (Activity) ctxt);
    } 

    public void setItemColor(int color){
        itemColor = color;
        colorizeToolbar(this, itemColor, (Activity) ctxt);
    }



    /**
     * Use this method to colorize toolbar icons to the desired target color
     * @param toolbarView toolbar view being colored
     * @param toolbarIconsColor the target color of toolbar icons
     * @param activity reference to activity needed to register observers
     */
    public static void colorizeToolbar(Toolbar toolbarView, int toolbarIconsColor, Activity activity) {
        final PorterDuffColorFilter colorFilter
                = new PorterDuffColorFilter(toolbarIconsColor, PorterDuff.Mode.SRC_IN);

        for(int i = 0; i < toolbarView.getChildCount(); i++) {
            final View v = toolbarView.getChildAt(i);

            doColorizing(v, colorFilter, toolbarIconsColor);
        }

      //Step 3: Changing the color of title and subtitle.
        toolbarView.setTitleTextColor(toolbarIconsColor);
        toolbarView.setSubtitleTextColor(toolbarIconsColor);
    }

    public static void doColorizing(View v, final ColorFilter colorFilter, int toolbarIconsColor){
        if(v instanceof ImageButton) {
            ((ImageButton)v).getDrawable().setAlpha(255);
            ((ImageButton)v).getDrawable().setColorFilter(colorFilter);
        }

        if(v instanceof ImageView) {
            ((ImageView)v).getDrawable().setAlpha(255);
            ((ImageView)v).getDrawable().setColorFilter(colorFilter);
        }

        if(v instanceof AutoCompleteTextView) {
            ((AutoCompleteTextView)v).setTextColor(toolbarIconsColor);
        }

        if(v instanceof TextView) {
            ((TextView)v).setTextColor(toolbarIconsColor);
        }

        if(v instanceof EditText) {
            ((EditText)v).setTextColor(toolbarIconsColor);
        }

        if (v instanceof ViewGroup){
            for (int lli =0; lli< ((ViewGroup)v).getChildCount(); lli ++){
                doColorizing(((ViewGroup)v).getChildAt(lli), colorFilter, toolbarIconsColor);
            }
        }

        if(v instanceof ActionMenuView) {
            for(int j = 0; j < ((ActionMenuView)v).getChildCount(); j++) {

                //Step 2: Changing the color of any ActionMenuViews - icons that
                //are not back button, nor text, nor overflow menu icon.
                final View innerView = ((ActionMenuView)v).getChildAt(j);

                if(innerView instanceof ActionMenuItemView) {
                    int drawablesCount = ((ActionMenuItemView)innerView).getCompoundDrawables().length;
                    for(int k = 0; k < drawablesCount; k++) {
                        if(((ActionMenuItemView)innerView).getCompoundDrawables()[k] != null) {
                            final int finalK = k;

                            //Important to set the color filter in seperate thread, 
                            //by adding it to the message queue
                            //Won't work otherwise. 
                            //Works fine for my case but needs more testing

                            ((ActionMenuItemView) innerView).getCompoundDrawables()[finalK].setColorFilter(colorFilter);

//                              innerView.post(new Runnable() {
//                                  @Override
//                                  public void run() {
//                                      ((ActionMenuItemView) innerView).getCompoundDrawables()[finalK].setColorFilter(colorFilter);
//                                  }
//                              });
                        }
                    }
                }
            }
        }
    }



}

Beziehen Sie sich dann in Ihrer Layoutdatei darauf. Jetzt können Sie mit eine benutzerdefinierte Farbe festlegen

toolbar.setItemColor(Color.Red);

Quellen:

Die Informationen dazu finden Sie hier: So ändern Sie dynamisch die Farbe der Android-Symbolleistensymbole

und dann habe ich es bearbeitet, verbessert und hier gepostet: GitHub: AndroidDynamicToolbarItemColor

Michael Kern
quelle
Dies beantwortet die Frage nicht. Besonders der Teil "Mein Ziel ist es, irgendwann die ActionBar zu haben und alle Widgets wie eine CheckBox diese Primärfarbe verwenden. "
Nhaarman
Fügen Sie dann einfach ein Kontrollkästchen hinzu. Fügen Sie beispielsweise if (v Instanz von CheckBox) {themeChexnoxWithColor (toolbarIconsColor) hinzu. Ich verstehe nicht, wie dies Ihre Frage nicht ehrlich beantwortet
Michael Kern
@nhaarman Sie können die Farbe der Aktionsleiste wie folgt dynamisch einstellen. stackoverflow.com/questions/23708637/change-actionbar-background-color-dynamically Ich verstehe Ihre Frage einfach nicht genau
Michael Kern
Ich habe eine App, in der der Benutzer die Farbe der Aktionsleiste und der Elementelemente der Aktionsleiste auswählen kann. Ich sehe nicht, was Sie sonst noch brauchen
Michael Kern
2
Das war sehr hilfreich für mich.
Firefly
-6

Folgendes können Sie tun:

Schreiben Sie eine Datei in einen zeichnbaren Ordner und nennen Sie sie background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="?attr/colorPrimary"/>
</shape>

Stellen Sie dann Ihr Layout ein (oder was auch immer der Fall ist) android:background="@drawable/background"

Beim Festlegen Ihres Themas würde diese Farbe dieselbe darstellen.

Ustaad
quelle