Définir la couleur d'arrière-plan du titre

106

Dans mon application Android, je souhaite que la barre de titre standard / basique change de couleur.

Pour changer la couleur du texte que vous avez setTitleColor(int color), existe-t-il un moyen de changer la couleur d'arrière-plan de la barre?

Thizzer
la source
Je pense qu'il n'est pas nécessaire d'utiliser un titre personnalisé pour changer la couleur d'arrière-plan en barre de titre. vérifier cet article
Deepthi Jabili
Je regarderais la réponse d'Edwinfad au lieu de celle acceptée obsolète.
zgc7009

Réponses:

186

Ce fil vous aidera à créer votre propre barre de titre dans un fichier xml et à l'utiliser dans vos activités

Éditer

Voici un bref résumé du contenu du lien ci-dessus - Il s'agit simplement de définir la couleur du texte et l'arrière-plan de la barre de titre - pas de redimensionnement, pas de boutons, juste l'exemple le plus simple

res / layout / mytitle.xml - C'est la vue qui représentera la barre de titre

<?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 - Nous voulons conserver le thème Android par défaut et avons juste besoin de changer la couleur d'arrière-plan de l'arrière-plan du titre. Nous créons donc un thème qui hérite du thème par défaut et définissons le style d'arrière-plan sur notre propre style.

<?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 - C'est ici que nous définissons le thème pour utiliser la couleur que nous voulons pour l'arrière-plan du titre

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

res / values ​​/ colors.xml - Définissez ici la couleur souhaitée

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

Dans AndroidMANIFEST.xml , définissez l'attribut de thème soit dans l'application (pour l'ensemble de l'application), soit dans les balises d'activité (uniquement cette activité)

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

À partir de l'activité (appelée 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);

}
Ccheneson
la source
9
La plupart du temps, le simple fait de fournir un lien est une réponse très bon marché, et sur stackoverflow, ce n'est pas vraiment apprécié. Essayez d'obtenir une partie des connaissances à partir du lien vers cette page. Vous obtiendrez de plus en plus de connaissances dans la communauté, et même si le lien est en panne, votre réponse fournit toujours des termes de recherche qui peuvent diriger d'autres personnes dans la direction.
Janusz
7
@Janusz: Vous avez tout à fait raison - J'ai donc mis à jour l'article avec l'exemple le plus simple afin que les gens puissent commencer avec au lieu de lire le fil de discussion dans le lien ci-dessus
ccheneson
3
Après avoir écrasé le style Android, vous n'avez pas besoin d'ajouter le titre personnalisé à partir du code si vous souhaitez simplement changer la couleur d'arrière-plan
Janusz
1
Comme Janusz l'a dit, vous n'avez pas besoin d'avoir une vue personnalisée si vous souhaitez uniquement remplacer le style utilisé (sans ajouter de nouvelles vues). Dans ce cas, vous n'avez pas non plus besoin de demander FEATURE_CUSTOM_STYLE. Enfin, vous pouvez définir le style au niveau de l'application pour l'appliquer à toutes vos activités à la fois. Merci pour le code, au fait.
Eric Kok
2
cela ne change pas la couleur d'arrière-plan du titre, seule la couleur du texte est modifiée. même si je change la couleur de la barre de titre <color name = "titlebackgroundcolor"> # 3232CD </color>. Est-ce que je fais quelque chose de mal?
Shaista Naaz
18

Merci pour cette explication claire, mais j'aimerais ajouter un peu plus à votre réponse en posant une question liée (je ne veux pas vraiment faire un nouveau message car celui-ci est le sous-sol de ma question).

Je déclare ma barre de titre dans une Superclasse à partir de laquelle, toutes mes autres activités sont des enfants, pour devoir changer la couleur de la barre une seule fois. Je voudrais également ajouter une icône et changer le texte dans la barre. J'ai fait quelques tests et j'ai réussi à changer l'un ou l'autre mais pas les deux en même temps (en utilisant setFeatureDrawable et setTitle). La solution idéale serait bien sûr de suivre l'explication dans le fil de discussion donné dans le lien, mais comme je le déclare dans une superclasse, j'ai un problème dû à la disposition de setContentView et du R.id.myCustomBar, car si je rappelez-vous bien que je ne peux appeler setContentView qu'une seule fois ...

EDIT J'ai trouvé ma réponse:

Pour ceux qui, comme moi, aiment travailler avec des superclasses parce que c'est génial pour avoir un menu disponible partout dans une application, cela fonctionne de la même manière ici.

Ajoutez simplement ceci à votre 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);

(vous devez déclarer le textview comme variable de classe protégée)

Et puis le pouvoir de ceci est que, partout dans votre application (si par exemple toutes vos activités sont des enfants de cette classe), il vous suffit d'appeler

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

et votre barre de titre sera modifiée.

Le XML associé dans mon cas est (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
la source
Pourquoi suis-je rejeté? Qu'est ce qui ne va pas avec mon code? ça marche parfaitement pour moi ...
Sephy
1
étant un débutant, je pense que ci-dessus est un bon morceau de code avec une bonne explication. +1 pour vous !!!
RK
@Sephy dois-je créer une classe différente pour la barre de titre alors seulement je peux l'utiliser?
Vikas Gupta
cela ne fonctionne pas ici stackoverflow.com/questions/31157222/…
Aditya
11

Il existe un autre moyen de changer la couleur d'arrière-plan, mais il s'agit d'un piratage et pourrait échouer sur les futures versions d'Android si la hiérarchie d'affichage de la fenêtre et son titre sont modifiés. Cependant, le code ne plantera pas, manquez simplement la définition de la couleur souhaitée, dans un tel cas.

Dans votre activité, comme onCreate, faites:

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));
  }
}
mikeplate
la source
très bon et simple aussi. Mais je veux vous demander une chose que celui-ci le fait à partir du code, donc il est peu retardé. Afin d'éviter une telle situation, je devrai tout écrire dans le xml et rien dans le code. alors pouvez-vous s'il vous plaît me guider là-dessus?
Shaista Naaz
Je pense que vous avez la solution dans la réponse sélectionnée ci-dessus. Vous devez définir un thème personnalisé pour l'activité et définir son android: windowTitleBackgroundStyle sur la couleur souhaitée.
mikeplate
7

Ce code permet de modifier l'arrière-plan de la barre de titre par programme dans Android. Changez la couleur en n'importe quelle couleur que vous voulez.

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

}
Edwinfad
la source
Cela a été introduit dans l'API 11 (3.0 Honeycomb) qui est certainement suffisamment obsolète à ce stade pour considérer cette option comme valide.
zgc7009
Mais je l'utilise toujours dans toutes mes applications récentes avec targetSdkVersion = "23" sans obtenir d'informations obsolètes.
Edwinfad
Absolument, il est 100% bien de l'utiliser. Il n'a été remplacé par rien, mais l'utiliser avant l'API 11 (ce que très peu de gens feront) doit être évité, du moins sans bibliothèque de compatibilité.
zgc7009
C'est noté. @ zgc7009
Edwinfad
1
Utilisez plutôt getSupportActionBar () si vous utilisez 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);
      }
    }

sur le code ci-dessus, vous pouvez essayer, vous pouvez utiliser le titre au lieu de la barre de titre, cela affectera toutes les activités de votre application

Pratishtha Goriya
la source
2

Je suppose que non. Vous pouvez créer une activité sans titre et créer votre propre barre de titre dans la mise en page de l'activité.

Vérifiez ceci , ligne 63 et ci-dessous:

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

définit la vue personnalisée au lieu de la vue titre par défaut.

skyman
la source
Comment / où puis-je créer une barre de titre personnalisée / propre?
Thizzer
2

Jetez un œil au platforms/android-2.1/data/res/layout/screen.xmlSDK. Il semble y définir un titre. Vous pouvez fréquemment examiner des mises en page comme celle-ci et emprunter style="?android:attr/windowTitleStyle" styles que vous pouvez ensuite utiliser et remplacer dans vos propres TextViews.

Vous pourrez peut-être même sélectionner le titre pour un peaufinage direct en faisant:

TextView title = (TextView)findViewById(android.R.id.title);
Steve Pomeroy
la source
1
Bonnes réponses ci-dessus, mais est-il possible de simplement colorer la barre de titre sans avoir à créer une mise en page personnalisée?
Eno
2

Essayez avec le code suivant

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

Utilisez également ce lien, c'est très utile: http://nathanael.hevenet.com/android-dev-changing-the-title-bar-background/

Pratik Butani
la source
Cela fonctionne-t-il toujours avec Lollipop? titleView semble renvoyer null pour moi.
WORMSS
1

Il existe une alternative plus simple pour changer la couleur de la barre de titre, en utilisant la bibliothèque de support v7 appcompat fournie par Google.

Consultez ce lien pour savoir comment configurer cette bibliothèque de support: https://developer.android.com/tools/support-library/setup.html

Une fois que vous avez fait cela, il suffit d'ajouter les lignes suivantes à votre fichier 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>

(en supposant que "titlebackgroundcolor" est défini dans votre res / values ​​/ colors.xml, par exemple:

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

)

stefan.m
la source
Lorsque vous ciblez uniquement Android 5, il existe une alternative encore plus simple, voir [ developer.android.com/training/material/… .
stefan.m
1

Les choses semblent s'être améliorées / simplifiées depuis Android 5.0 (niveau d'API 21).

Je pense que ce que vous recherchez est quelque chose comme ceci:

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

Voir ici pour référence:

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

Loisaida Sam Sandberg
la source
1

J'ai fait cela en changeant les valeurs de couleur de style dans "res" -> "values" -> "colors.xml" entrez la description de l'image ici

Cela changera les couleurs pour tout le projet, ce qui me convient.

entrez la description de l'image ici

Brlja
la source
0

tu peux l'utiliser.

  toolbar.setTitleTextColor(getResources().getColor(R.color.white));
Pavel
la source
0

Collez ce code après setContentView ou dans onCreate

si vous avez un code couleur, utilisez ceci;

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

si vous voulez un code spécifique de la bibliothèque de couleurs, utilisez ceci;

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