Definir a cor de fundo do título

106

No meu aplicativo Android, quero que a barra de título padrão / básica mude de cor.

Para alterar a cor do texto que você tem setTitleColor(int color), há uma maneira de alterar a cor de fundo da barra?

Thizzer
fonte
Acho que não há necessidade de usar o título personalizado para alterar a cor de fundo da barra de título. verifique esta postagem
Deepthi Jabili
Gostaria de olhar para a resposta de Edwinfad em vez da desatualizada aceita.
zgc7009

Respostas:

186

Este tópico irá ajudá-lo a começar a construir sua própria barra de título em um arquivo xml e usá-la em suas atividades

Editar

Aqui está um breve resumo do conteúdo do link acima - Isso é apenas para definir a cor do texto e o fundo da barra de título - sem redimensionamento, sem botões, apenas a amostra mais simples

res / layout / mytitle.xml - Esta é a visualização que representará a barra de título

<?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 - Queremos manter o tema android padrão e só precisamos mudar a cor de fundo do fundo do título. Portanto, criamos um tema que herda o tema padrão e definimos o estilo de fundo para nosso próprio estilo.

<?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 - Aqui é onde definimos o tema para usar a cor que queremos para o fundo do título

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

res / values ​​/ colors.xml - Defina aqui a cor desejada

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

No AndroidMANIFEST.xml , defina o atributo theme no aplicativo (para todo o aplicativo) ou nas tags de atividade (apenas esta atividade)

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

Na atividade (chamada 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
fonte
9
Na maioria das vezes, apenas fornecer um link é uma resposta muito barata e, no stackoverflow, não gostei muito. Tente obter algum conhecimento do link para esta página. Você obterá mais e mais conhecimento na comunidade e, mesmo que o link esteja inativo, sua resposta ainda fornece alguns termos de pesquisa que podem direcionar outras pessoas na direção.
Janusz,
7
@Janusz: Você está totalmente certo - então atualizei a postagem com o exemplo mais simples para que as pessoas possam começar em vez de ler o tópico no link acima
ccheneson
3
Depois de substituir o estilo do Android, você não precisa adicionar o título personalizado do código se quiser apenas alterar a cor do plano de fundo
Janusz
1
Como disse Janusz, você não precisa ter uma Visualização personalizada se quiser apenas sobrescrever o estilo usado (não adicionar novas Visualizações). Nesse caso, você também não precisa solicitar um FEATURE_CUSTOM_STYLE. Finalmente, você pode definir o estilo no nível do aplicativo para aplicá-lo a todas as suas atividades de uma vez. Obrigado pelo código, a propósito.
Eric Kok
2
isso não altera a cor de fundo do título, apenas a cor do texto é alterada. mesmo se eu estiver mudando a cor da barra de título <color name = "titlebackgroundcolor"> # 3232CD </color>. Estou fazendo algo errado?
Shaista Naaz
18

Obrigado por esta explicação clara, no entanto, gostaria de acrescentar um pouco mais à sua resposta, fazendo uma pergunta vinculada (não quero fazer um novo post, pois este é o fundamento da minha pergunta).

Estou declarando minha barra de título em uma Superclasse da qual todas as minhas outras atividades são filhas, para ter que mudar a cor da barra apenas uma vez. Também gostaria de adicionar um ícone e alterar o texto na barra. Fiz alguns testes e consegui mudar um ou outro, mas não os dois ao mesmo tempo (usando setFeatureDrawable e setTitle). A solução ideal seria, claro, seguir a explicação no tópico fornecido no link, mas como estou declarando em uma superclasse, tenho um problema devido ao layout em setContentView e a R.id.myCustomBar, porque se eu lembre-se de que posso chamar setContentView apenas uma vez ...

EDITAR Encontrei minha resposta:

Para quem, como eu, gosta de trabalhar com superclasses porque é ótimo ter um menu disponível em qualquer lugar de um aplicativo, funciona da mesma forma aqui.

Basta adicionar isso à sua 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);

(você tem que declarar o textview como variável de classe protegida)

E o poder disso é que, em qualquer lugar em seu aplicativo (se, por exemplo, todas as suas atividades forem filhas desta classe), você só precisa chamar

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

e sua barra de título será editada.

O XML associado no meu 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>
Sephy
fonte
Por que estou sendo rejeitado? o que há de errado com meu código? funciona perfeitamente para mim ...
Sephy
1
sendo um iniciante, acho que acima é um bom pedaço de código com boa explicação. 1 para você !!!
RK
@Sephy eu tenho que fazer uma classe diferente para a barra de título e só eu posso usá-la?
Vikas Gupta
não está funcionando aqui stackoverflow.com/questions/31157222/…
Aditya
11

Existe outra maneira de alterar a cor de fundo, no entanto, é um hack e pode falhar em versões futuras do Android se a hierarquia de visualização da janela e seu título forem alterados. Porém, o código não travará, apenas deixará de definir a cor desejada, nesse caso.

Em sua atividade, como onCreate, faça:

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));
  }
}
placa de microfone
fonte
muito bom e simples também. Mas eu quero perguntar a você uma coisa que este aqui está fazendo isso a partir do código, então é um pouco atrasado. Para evitar tal situação terei que escrever tudo no xml e nada no código. então você pode me guiar nisso?
Shaista Naaz
Acho que você tem a solução na resposta selecionada acima. Você precisa definir um tema personalizado para a atividade e definir seu android: windowTitleBackgroundStyle com a cor desejada.
mikeplate de
7

Este código ajuda a alterar o plano de fundo da barra de título de forma programática no Android. Mude a cor para qualquer cor desejada.

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

}
Edwinfad
fonte
Isso foi introduzido na API 11 (3.0 Honeycomb), que certamente está desatualizado o suficiente neste ponto para considerá-la uma opção válida.
zgc7009
Mas ainda estou usando em todos os meus aplicativos recentes com targetSdkVersion = "23" sem obter nenhuma informação obsoleta.
Edwinfad
Com certeza, é 100% bom usar isso. Não foi substituído por nada, mas deve-se evitar usá-lo antes da API 11 (o que poucas pessoas farão), pelo menos sem uma biblioteca de compatibilidade.
zgc7009
Notado. @ zgc7009
Edwinfad
1
Em vez disso, use getSupportActionBar () se estiver 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);
      }
    }

no código acima, você pode tentar, você pode usar o título em vez da barra de título isso afetará todas as atividades em seu aplicativo

Pratishtha Goriya
fonte
2

Suponho que não. Você pode criar atividades sem título e criar sua própria barra de título no layout de atividades.

Verifique isto , Linha 63 e abaixo:

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

define a visualização personalizada em vez da visualização do título padrão.

homem do céu
fonte
Como / onde posso criar uma barra de título personalizada / própria?
Thizzer
2

Dê uma olhada no platforms/android-2.1/data/res/layout/screen.xmlSDK. Parece definir um título ali. Você pode frequentemente examinar layouts como este e emprestar os style="?android:attr/windowTitleStyle" estilos que você pode usar e substituir em seus próprios TextViews.

Você pode até mesmo selecionar o título para ajustes diretos, fazendo:

TextView title = (TextView)findViewById(android.R.id.title);
Steve Pomeroy
fonte
1
Boas respostas acima, mas é possível apenas colorir a barra de título sem ter que criar um layout personalizado para ela?
Eno
2

Tente com o seguinte código

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

também use este link, é muito útil: http://nathanael.hevenet.com/android-dev-changing-the-title-bar-background/

Pratik Butani
fonte
Isso ainda funciona com o Lollipop? titleView parece retornar null para mim.
WORMSS
1

Existe uma alternativa mais fácil para alterar a cor da barra de título, usando a biblioteca de suporte appcompat v7 fornecida pelo Google.

Veja este link sobre como configurar esta biblioteca de suporte: https://developer.android.com/tools/support-library/setup.html

Depois de fazer isso, é suficiente adicionar as seguintes linhas ao seu arquivo 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>

(assumindo que "titlebackgroundcolor" está definido em res / values ​​/ colors.xml, por exemplo:

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

)

stefan.m
fonte
Quando você visa apenas o Android 5, há uma alternativa ainda mais simples, consulte [ developer.android.com/training/material/… .
stefan.m
1

As coisas parecem ter ficado melhores / mais fáceis desde o Android 5.0 (API de nível 21).

Acho que você está procurando algo assim:

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

Veja aqui para referência:

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

Loisaida Sam Sandberg
fonte
1

Eu fiz isso alterando os valores de cores de estilo em "res" -> "valores" -> "cores.xml" insira a descrição da imagem aqui

Isso mudará as cores de todo o projeto, o que está bom para mim.

insira a descrição da imagem aqui

Brlja
fonte
0

você pode usar isso.

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

Cole este código após setContentView ou em onCreate

se você tiver um código de cores, use-o;

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

se você quiser um código específico da biblioteca de cores, use-o;

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