Imposta il colore di sfondo del titolo


106

Nella mia applicazione Android voglio che la barra del titolo standard / di base cambi colore.

Per cambiare il colore del testo che hai setTitleColor(int color), c'è un modo per cambiare il colore di sfondo della barra?


Penso che non sia necessario utilizzare un titolo personalizzato per cambiare il colore di sfondo nella barra del titolo. controlla questo post
Deepthi Jabili

Guarderei la risposta di Edwinfad invece di quella obsoleta accettata.
zgc7009

Risposte:


186

Questo thread ti consentirà di iniziare a creare la tua barra del titolo in un file xml e utilizzarla nelle tue attività

modificare

Ecco un breve riepilogo del contenuto del collegamento sopra - Serve solo per impostare il colore del testo e lo sfondo della barra del titolo - nessun ridimensionamento, nessun pulsante, solo il campione più semplice

res / layout / mytitle.xml - Questa è la vista che rappresenterà la barra del titolo

<?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 ​​/ themes.xml - Vogliamo mantenere il tema Android predefinito e dobbiamo solo cambiare il colore di sfondo dello sfondo del titolo. Quindi creiamo un tema che eredita il tema predefinito e impostiamo lo stile di sfondo sul nostro stile.

<?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 - Qui è dove impostiamo il tema per utilizzare il colore che vogliamo per lo sfondo del titolo

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

res / values ​​/ colors.xml - Imposta qui il colore che desideri

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

In AndroidMANIFEST.xml , imposta l'attributo del tema nell'applicazione (per l'intera applicazione) o nei tag dell'attività (solo questa attività)

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

Dall'attività (chiamata CustomTitleBar):

@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);

}

9
Il più delle volte fornire solo un collegamento è una risposta molto economica e su stackoverflow non è piaciuta molto. Cerca di ottenere un po 'di conoscenza dal link in questa pagina. Otterrai sempre più conoscenze nella comunità e anche se il link è inattivo, la tua risposta fornisce comunque alcuni termini di ricerca che possono indirizzare altre persone nella direzione.
Janusz

7
@ Janusz: Hai assolutamente ragione - Quindi ho aggiornato il post con l'esempio più semplice in modo che le persone possano iniziare invece di leggere il thread nel link sopra
ccheneson

3
Dopo aver sovrascritto lo stile di Android non è necessario aggiungere il titolo personalizzato dal codice se si desidera modificare il colore di sfondo
Janusz

1
Come ha detto Janusz, non è necessario disporre di una vista personalizzata se si desidera solo sovrascrivere lo stile utilizzato (senza aggiungere nuove viste). In tal caso, inoltre, non è necessario richiedere un FEATURE_CUSTOM_STYLE. Infine, puoi definire lo stile a livello di applicazione per applicarlo a tutte le tue attività contemporaneamente. Grazie per il codice, comunque.
Eric Kok

2
questo non cambia il colore di sfondo del titolo, solo il colore del testo viene cambiato. anche se sto cambiando il colore della barra del titolo <color name = "titlebackgroundcolor"> # 3232CD </color>. Sto facendo qualcosa di sbagliato?
Shaista Naaz

18

Grazie per questa chiara spiegazione, tuttavia vorrei aggiungere un po 'di più alla tua risposta ponendo una domanda collegata (non voglio davvero fare un nuovo post poiché questo è il fondamento della mia domanda).

Dichiaro la mia barra del titolo in una Superclass dalla quale, tutte le mie altre attività sono bambini, di dover cambiare il colore della barra solo una volta. Vorrei anche aggiungere un'icona e modificare il testo nella barra. Ho eseguito alcuni test e sono riuscito a cambiare l'uno o l'altro ma non entrambi contemporaneamente (usando setFeatureDrawable e setTitle). La soluzione ideale sarebbe ovviamente seguire la spiegazione nel thread fornita nel collegamento, ma poiché sto dichiarando in una superclasse, ho un problema a causa del layout in setContentView e R.id.myCustomBar, perché se io ricorda bene che posso chiamare setContentView solo una volta ...

EDIT Ho trovato la mia risposta:

Per coloro a cui, come me, piace lavorare con le superclassi perché è ottimo per avere un menu disponibile ovunque in un'app, qui funziona allo stesso modo.

Aggiungilo alla tua superclasse:

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

(devi dichiarare la textview come variabile di classe protetta)

E poi il potere di questo è che, ovunque nella tua app (se ad esempio tutte le tue attività sono figli di questa classe), devi solo chiamare

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

e la barra del titolo verrà modificata.

L'XML associato nel mio caso è (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>

Perché sono stato bocciato? cosa c'è di sbagliato nel mio codice? funziona perfettamente per me ...
Sephy

1
essendo un principiante sento che sopra è un bel pezzo di codice con una buona spiegazione. +1 per te !!!
RK

@Sephy devo creare una classe diversa per la barra del titolo, quindi solo io posso usarla?
Vikas Gupta


11

C'è un altro modo per cambiare il colore di sfondo, tuttavia è un trucco e potrebbe non riuscire nelle versioni future di Android se la gerarchia di visualizzazione della finestra e il suo titolo vengono modificati. Tuttavia, il codice non si bloccherà, in tal caso mancherà di impostare il colore desiderato.

Nella tua attività, come onCreate, fai:

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));
  }
}

molto buono e anche semplice. Ma voglio chiederti una cosa che questo lo fa dal codice, quindi è un po 'ritardato. Per evitare tale situazione dovrò scrivere tutto nell'xml e niente nel codice. quindi puoi guidarmi in questo per favore?
Shaista Naaz

Penso che tu abbia la soluzione nella risposta selezionata sopra. È necessario definire un tema personalizzato per l'attività e impostare il suo android: windowTitleBackgroundStyle sul colore desiderato.
mikeplate

7

Questo codice aiuta a cambiare lo sfondo della barra del titolo a livello di codice in Android. Cambia il colore in qualsiasi colore tu voglia.

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

}

Questo è stato introdotto nell'API 11 (3.0 Honeycomb) che è sicuramente abbastanza obsoleto a questo punto da considerarlo un'opzione valida.
zgc7009

Ma lo sto ancora utilizzando in tutte le mie applicazioni recenti con targetSdkVersion = "23" senza ottenere informazioni deprecate.
Edwinfad

Assolutamente, va bene al 100% usarlo. Non è stato sostituito con nulla, ma usarlo prima dell'API 11 (cosa che pochissime persone faranno) dovrebbe essere evitato, almeno senza una libreria di compatibilità.
zgc7009

Notato. @ zgc7009
Edwinfad

1
Usa getSupportActionBar () invece se stai usando 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);
      }
    }

sul codice sopra puoi provare puoi usare il titolo invece della barra del titolo questo influenzerà tutte le attività nella tua applicazione


2

Suppongo di no. È possibile creare attività senza titolo e creare la propria barra del titolo nel layout dell'attività.

Controlla questo , riga 63 e sotto:

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

imposta la vista personalizzata invece della vista titolo predefinita.


Come / dove posso creare una barra del titolo personalizzata / personalizzata?
Thizzer

2

Dai un'occhiata platforms/android-2.1/data/res/layout/screen.xmlall'SDK. Sembra definire un titolo lì. Puoi spesso esaminare layout come questo e prendere in prestito il file style="?android:attr/windowTitleStyle" stili che puoi utilizzare e sovrascrivere nelle tue TextView.

Potresti anche essere in grado di selezionare il titolo per il tweaking diretto facendo:

TextView title = (TextView)findViewById(android.R.id.title);

1
Buone risposte sopra, ma è possibile colorare la barra del titolo senza dover creare un layout personalizzato?
Eno

2

Prova con il codice seguente

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);
      }
    }

utilizzare anche questo link è molto utile: http://nathanael.hevenet.com/android-dev-changing-the-title-bar-background/


Funziona ancora con Lollipop? titleView sembra restituire null per me.
WORMSS

1

Esiste un'alternativa più semplice per modificare il colore della barra del titolo, utilizzando la libreria di supporto appcompat v7 fornita da Google.

Vedi questo collegamento su come configurare questa libreria di supporto: https://developer.android.com/tools/support-library/setup.html

Dopo averlo fatto, è sufficiente aggiungere le seguenti righe al file res / values ​​/ styles.xml:

<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>

(supponendo che "titlebackgroundcolor" sia definito nel tuo res / values ​​/ colors.xml, ad esempio:

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

)


Quando scegli come target solo Android 5, c'è un'alternativa ancora più semplice, vedi [ developer.android.com/training/material/… .
stefan.m

1

Le cose sembrano essere migliorate / più facili da Android 5.0 (livello API 21).

Penso che quello che stai cercando sia qualcosa del genere:

<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>

Vedi qui per riferimento:

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


1

L'ho fatto modificando i valori del colore dello stile in "res" -> "values" -> "colors.xml" inserisci qui la descrizione dell'immagine

Questo cambierà i colori per l'intero progetto che va bene con me.

inserisci qui la descrizione dell'immagine


0

Puoi usarlo.

  toolbar.setTitleTextColor(getResources().getColor(R.color.white));

0

Incolla questo codice dopo setContentView o in onCreate

se hai un codice colore usalo;

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

se vuoi un codice specifico dalla libreria dei colori usa questo;

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.