Stellen Sie die Hintergrundfarbe des Titels ein

106

In meiner Android-Anwendung soll die Standard- / Basis-Titelleiste ihre Farbe ändern.

Gibt setTitleColor(int color)es eine Möglichkeit, die Hintergrundfarbe der Leiste zu ändern, um die Textfarbe zu ändern?

Thizzer
quelle
Ich denke, Sie müssen keinen benutzerdefinierten Titel verwenden, um die Hintergrundfarbe in die Titelleiste zu ändern. Überprüfen Sie diesen Beitrag
Deepthi Jabili
Ich würde mir Edwinfads Antwort anstatt der veralteten akzeptierten ansehen.
zgc7009

Antworten:

186

In diesem Thread können Sie zunächst eine eigene Titelleiste in einer XML-Datei erstellen und in Ihren Aktivitäten verwenden

Bearbeiten

Hier ist eine kurze Zusammenfassung des Inhalts des obigen Links - Dies dient nur zum Festlegen der Farbe des Textes und des Hintergrunds der Titelleiste - keine Größenänderung, keine Schaltflächen, nur das einfachste Beispiel

res / layout / mytitle.xml - Dies ist die Ansicht, die die Titelleiste darstellt

<?xml version="1.0" encoding="utf-8"?>
<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/myTitle"
  android:text="This is my new title"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:textColor="@color/titletextcolor"
   />

res / values ​​/ theme.xml - Wir möchten das Standard-Android- Design beibehalten und müssen nur die Hintergrundfarbe des Titelhintergrunds ändern. Also erstellen wir ein Thema, das das Standardthema erbt, und setzen den Hintergrundstil auf unseren eigenen Stil.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="customTheme" parent="android:Theme"> 
        <item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>   
    </style> 
</resources>

res / values ​​/ styles.xml - Hier legen wir das Thema so fest, dass die gewünschte Farbe für den Titelhintergrund verwendet wird

<?xml version="1.0" encoding="utf-8"?>
<resources> 
   <style name="WindowTitleBackground">     
        <item name="android:background">@color/titlebackgroundcolor</item>                   
    </style>
</resources>

res / values ​​/ color.xml - Stellen Sie hier die gewünschte Farbe ein

<?xml version="1.0" encoding="utf-8"?>
<resources>   
    <color name="titlebackgroundcolor">#3232CD</color>
    <color name="titletextcolor">#FFFF00</color>
</resources>

Legen Sie in der Datei AndroidMANIFEST.xml das Designattribut entweder in den Anwendungs-Tags (für die gesamte Anwendung) oder in den Aktivitäts-Tags (nur für diese Aktivität) fest

<activity android:name=".CustomTitleBar" android:theme="@style/customTheme" ...

Aus der Aktivität (CustomTitleBar genannt):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.mytitle);

}
Ccheneson
quelle
9
Die meiste Zeit ist das Bereitstellen eines Links eine sehr billige und auf Stackoverflow nicht wirklich beliebte Antwort. Versuchen Sie, etwas Wissen über den Link auf diese Seite zu erlangen. Sie erhalten immer mehr Wissen in der Community, und selbst wenn der Link nicht funktioniert, enthält Ihre Antwort einige Suchbegriffe, die andere Personen in die richtige Richtung lenken können.
Janusz
7
@ Janusz: Sie haben völlig Recht - Also habe ich den Beitrag mit dem einfachsten Beispiel aktualisiert, damit die Leute anfangen können, anstatt den Thread im obigen Link
durchzulesen
3
Nach dem Überschreiben des Android-Stils müssen Sie den benutzerdefinierten Titel nicht aus dem Code hinzufügen, wenn Sie nur die Hintergrundfarbe ändern möchten
Janusz
1
Wie Janusz sagte, benötigen Sie keine benutzerdefinierte Ansicht, wenn Sie nur den verwendeten Stil überschreiben möchten (ohne neue Ansichten hinzuzufügen). In diesem Fall müssen Sie auch kein FEATURE_CUSTOM_STYLE anfordern. Schließlich können Sie den Stil auf Anwendungsebene definieren, um ihn auf alle Ihre Aktivitäten gleichzeitig anzuwenden. Danke übrigens für den Code.
Eric Kok
2
Dadurch wird die Hintergrundfarbe des Titels nicht geändert. Nur die Textfarbe wird geändert. auch wenn ich die Farbe der Titelleiste ändere <color name = "titlebackgroundcolor"> # 3232CD </ color>. Mache ich etwas falsch?
Shaista Naaz
18

Vielen Dank für diese klare Erklärung, aber ich möchte Ihrer Antwort etwas mehr hinzufügen, indem ich eine verknüpfte Frage stelle (ich möchte nicht wirklich einen neuen Beitrag verfassen, da dieser der Keller meiner Frage ist).

Ich deklariere meine Titelleiste in einer Superklasse, aus der alle meine anderen Aktivitäten Kinder sind, um die Farbe der Leiste nur einmal ändern zu müssen. Ich möchte auch ein Symbol hinzufügen und den Text in der Leiste ändern. Ich habe einige Tests durchgeführt und es geschafft, entweder das eine oder das andere, aber nicht beide gleichzeitig zu ändern (mit setFeatureDrawable und setTitle). Die ideale Lösung wäre natürlich, der Erklärung im Thread im Link zu folgen, aber da ich in einer Oberklasse deklariere, habe ich ein Problem aufgrund des Layouts in setContentView und der R.id.myCustomBar, denn wenn i Denken Sie daran, ich kann setContentView nur einmal aufrufen ...

EDIT Meine Antwort gefunden:

Für diejenigen, die wie ich gerne mit Superklassen arbeiten, weil es großartig ist, ein Menü überall in einer App verfügbar zu machen, funktioniert es hier genauso.

Fügen Sie dies einfach Ihrer Oberklasse hinzu:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.customtitlebar);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.customtitlebar);
    customTitleText = (TextView) findViewById(R.id.customtitlebar);

(Sie müssen die Textansicht als geschützte Klassenvariable deklarieren.)

Und dann ist die Stärke davon, dass Sie überall in Ihrer App (wenn zum Beispiel alle Ihre Aktivitäten Kinder dieser Klasse sind) nur anrufen müssen

customTitleText.setText("Whatever you want in title");

und Ihre Titelleiste wird bearbeitet.

Das in meinem Fall zugeordnete XML lautet (R.layout.customtitlebar):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="@color/background">
<ImageView android:layout_width="25px" android:layout_height="25px"
    android:src="@drawable/icontitlebar"></ImageView>
<TextView android:id="@+id/customtitlebar"
    android:layout_width="wrap_content" android:layout_height="fill_parent"
    android:text="" android:textColor="@color/textcolor" android:textStyle="bold"
    android:background="@color/background" android:padding="3px" />
</LinearLayout>
Sephy
quelle
Warum werde ich abgewählt? Was ist los mit meinem Code? es funktioniert perfekt für mich ...
Sephy
1
Als Anfänger denke ich, dass oben ein schönes Stück Code mit guter Erklärung ist. +1 für dich !!!
RK
@Sephy muss ich eine andere Klasse für die Titelleiste erstellen, dann kann nur ich sie verwenden?
Vikas Gupta
Es funktioniert hier nicht stackoverflow.com/questions/31157222/…
Aditya
11

Es gibt eine andere Möglichkeit, die Hintergrundfarbe zu ändern. Dies ist jedoch ein Hack und kann in zukünftigen Android-Versionen fehlschlagen, wenn die Ansichtshierarchie des Fensters und sein Titel geändert werden. In einem solchen Fall stürzt der Code jedoch nicht ab. Verpassen Sie einfach nicht die gewünschte Farbe.

Führen Sie in Ihrer Aktivität wie bei onCreate Folgendes aus:

View titleView = getWindow().findViewById(android.R.id.title);
if (titleView != null) {
  ViewParent parent = titleView.getParent();
  if (parent != null && (parent instanceof View)) {
    View parentView = (View)parent;
    parentView.setBackgroundColor(Color.rgb(0x88, 0x33, 0x33));
  }
}
Mikrofonplatte
quelle
sehr gut und auch einfach. Aber ich möchte Sie eine Sache fragen, dass dieser es aus Code macht, damit es etwas verzögert wird. Um eine solche Situation zu vermeiden, muss ich alles in die XML und nichts in den Code schreiben. Kannst du mich bitte dazu führen?
Shaista Naaz
Ich denke, Sie haben die Lösung in der oben ausgewählten Antwort. Sie müssen ein benutzerdefiniertes Thema für die Aktivität definieren und dessen Android: windowTitleBackgroundStyle auf die gewünschte Farbe einstellen.
Mikeplate
7

Dieser Code hilft, den Hintergrund der Titelleiste in Android programmgesteuert zu ändern. Ändern Sie die Farbe in eine beliebige Farbe.

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    getActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#1c2833")));

}
Edwinfad
quelle
Dies wurde in API 11 (3.0 Honeycomb) eingeführt, das an dieser Stelle sicherlich veraltet genug ist, um dies als gültige Option zu betrachten.
zgc7009
Aber ich verwende es immer noch in all meinen letzten Anwendungen mit targetSdkVersion = "23", ohne veraltete Informationen zu erhalten.
Edwinfad
Es ist absolut 100% in Ordnung, dies zu verwenden. Es wurde nicht durch irgendetwas ersetzt, aber die Verwendung vor API 11 (was nur sehr wenige Leute tun werden) sollte vermieden werden, zumindest ohne eine Kompatibilitätsbibliothek.
zgc7009
Notiert. @ zgc7009
Edwinfad
1
Verwenden Sie stattdessen getSupportActionBar (), wenn Sie AppCompatActivity
mondlos
6
protected void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    View titleView = getWindow().findViewById(android.R.id.title);
    if (titleView != null) {
      ViewParent parent = titleView.getParent();
      if (parent != null && (parent instanceof View)) {
        View parentView = (View)parent;
        parentView.setBackgroundColor(Color.RED);
      }
    }

Mit dem obigen Code können Sie versuchen, den Titel anstelle der Titelleiste zu verwenden Dies sich auf alle Aktivitäten in Ihrer Anwendung aus

Pratishtha Goriya
quelle
2

Ich nehme an nein. Sie können titellose Aktivitäten erstellen und eine eigene Titelleiste im Aktivitätslayout erstellen.

Überprüfen Sie dies , Zeile 63 und darunter:

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1)

Legt die benutzerdefinierte Ansicht anstelle der Standardtitelansicht fest.

Himmelmann
quelle
Wie / wo kann ich eine benutzerdefinierte / eigene Titelleiste erstellen?
Thizzer
2

Werfen Sie einen Blick in platforms/android-2.1/data/res/layout/screen.xmldas SDK. Es scheint dort einen Titel zu definieren. Sie können solche Layouts häufig untersuchen und die style="?android:attr/windowTitleStyle" Stile ausleihen , die Sie dann verwenden und in Ihren eigenen Textansichten überschreiben können.

Möglicherweise können Sie sogar den Titel für die direkte Optimierung auswählen, indem Sie Folgendes tun:

TextView title = (TextView)findViewById(android.R.id.title);
Steve Pomeroy
quelle
1
Gute Antworten oben, aber ist es möglich, nur die Titelleiste einzufärben, ohne ein benutzerdefiniertes Layout dafür erstellen zu müssen?
Eno
2

Versuchen Sie es mit dem folgenden Code

View titleView = getWindow().findViewById(android.R.id.title);
    if (titleView != null) {
      ViewParent parent = titleView.getParent();
      if (parent != null && (parent instanceof View)) {
        View parentView = (View)parent;
        parentView.setBackgroundColor(Color.RED);
      }
    }

Verwenden Sie auch diesen Link, der sehr nützlich ist: http://nathanael.hevenet.com/android-dev-changing-the-title-bar-background/

Pratik Butani
quelle
Funktioniert das noch mit Lollipop? titleView scheint für mich null zurückzugeben.
WORMSS
1

Es gibt eine einfachere Alternative, die Farbe der Titelleiste zu ändern, indem Sie die von Google bereitgestellte v7-Appcompat-Unterstützungsbibliothek verwenden.

Unter diesem Link erfahren Sie, wie Sie diese Support-Bibliothek einrichten : https://developer.android.com/tools/support-library/setup.html

Sobald Sie dies getan haben, reicht es aus, der Datei res / values ​​/ styles.xml die folgenden Zeilen hinzuzufügen:

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:actionBarStyle">@style/ActionBar</item>
</style>

<!-- Actionbar Theme -->
<style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@color/titlebackgroundcolor</item>
</style>

(unter der Annahme, dass "titlebackgroundcolor" in Ihrer res / values ​​/ colours.xml definiert ist, z.

<color name="titlebackgroundcolor">#0000AA</color>

)

stefan.m
quelle
Wenn Sie nur auf Android 5 abzielen , gibt es eine noch einfachere Alternative, siehe [ developer.android.com/training/material/… .
stefan.m
1

Seit Android 5.0 (API Level 21) scheinen die Dinge besser / einfacher geworden zu sein.

Ich denke, was Sie suchen, ist ungefähr so:

<style name="AppTheme" parent="AppBaseTheme">
    <!-- Top-top notification/status bar color: -->
    <!--<item name="colorPrimaryDark">#000000</item>-->
    <!-- App bar color: -->
    <item name="colorPrimary">#0000FF</item>
</style>

Siehe hier als Referenz:

https://developer.android.com/training/material/theme.html#ColorPalette

Loisaida Sam Sandberg
quelle
1

Ich habe dies getan, indem ich die Stilfarbwerte in "res" -> "values" -> "colours.xml" geändert habe. Geben Sie hier die Bildbeschreibung ein

Dadurch werden die Farben für das gesamte Projekt geändert, was für mich in Ordnung ist.

Geben Sie hier die Bildbeschreibung ein

Brlja
quelle
0

du kannst es benutzen.

  toolbar.setTitleTextColor(getResources().getColor(R.color.white));
pavel
quelle
0

Fügen Sie diesen Code nach setContentView oder in onCreate ein

Wenn Sie einen Farbcode haben, verwenden Sie diesen;

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#408ed4")));

Wenn Sie einen bestimmten Code aus der Farbbibliothek wünschen, verwenden Sie diesen;

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
Abdullah alkış
quelle