Como mudar a cor da barra de Estado no android
Como é que eu mudo a cor da barra de Estado que deve ser a mesma que na barra de navegação.
quero que a cor da barra de Estado seja igual à cor da barra de navegação
13 answers
O Android 5.0 Lollipop introduziu o tema de design de materiais que coloriza automaticamente a barra de estado com base no valor colorPrimaryDark
do tema.
Isto é suportado no dispositivo pré-Chupa graças ao suporte da biblioteca-v7-appcompat a partir da versão 21. Blogpost sobre suporte appcompat v21 de Chris Banes
Leia mais sobre o tema do Material no site oficial de Desenvolvedores Android
Actualização:
Chupa-Chupa:
public abstract void setStatusBarColor (int color)
Adicionado ao nível 21 da API
O Lollipop Android trouxe consigo a capacidade de mudar a cor da barra de Estado no seu aplicativo para uma experiência de usuário mais imersiva e em sintonia com o Google Material Design Guidelines
.
Aqui está como você pode mudar a cor da barra de estado usando o novo método window.setStatusBarColor
introduzido em API level 21
.
Mudar a cor da barra de Estado também necessita de definir duas opções adicionais na janela; você é necessário adicionar a bandeira FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
e limpar a bandeira FLAG_TRANSLUCENT_STATUS
.
Código De Trabalho:
Window window = activity.getWindow();
// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// finally change the color
window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));
Referência oficial do programador: setStatusBarColor (int)
Exemplo: material-design-em todo o lado
Chris Banes Blog-appcompat v21: material design para dispositivos pré-Chupa-Chupa!
O transitionName
para o fundo da vista será android:status:background
.
Coloque estes são os seus valores-v21 / styles.xml, para activar isto no Chupa-Chupa:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/color_primary</item>
<item name="colorPrimaryDark">@color/color_secondary</item>
<item name="colorAccent">@color/color_accent</item>
<item name="android:statusBarColor">@color/color_primary</item>
</style>
</resources>
- no meu xml adicionei ao topo esta Vista:
<View android:id="@+id/statusBarBackground" android:layout_width="match_parent" android:layout_height="wrap_content" />
Depois fiz este método:
public void setStatusBarColor(View statusBar,int color){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//status bar height
int actionBarHeight = getActionBarHeight();
int statusBarHeight = getStatusBarHeight();
//action bar height
statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
statusBar.setBackgroundColor(color);
}
}
Também precisa desses dois métodos para obter a altura da barra de acção e o estado da barra:
public int getActionBarHeight() {
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
{
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
return actionBarHeight;
}
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
Então a única coisa que você precisa é esta linha para definir a cor da barra de Estado:
setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do what you need for this SDK
};
Também não gosto de duplicar o código. Na sua resposta, Tenho de acrescentar essa linha de código em todas as actividades:
setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));
Então, peguei na solução Izhar e usei XML para obter o mesmo resultado:
Criar uma disposição para a barra de estado_ barra de Estado.xml
<View xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/statusBarHeight"
android:background="@color/primaryColorDark"
android:elevation="@dimen/statusBarElevation">
Repare nos atributos altura e altitude, estes serão definidos em valores, valores-v19, valores-v21 mais abaixo.
Adicione esta disposição à sua disposição de actividades usando a opção include, main_ Activity.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Black" >
<include layout="@layout/status_bar"/>
<include android:id="@+id/app_bar" layout="@layout/app_bar"/>
//The rest of your layout
</RelativeLayout>
Para a barra de ferramentas, adicione o atributo top margin:
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:elevation="@dimen/toolbarElevation"
android:layout_marginTop="@dimen/appBarTopMargin"
android:textDirection="ltr"
android:layoutDirection="ltr">
No teu estilo appTheme-v19.xml e styles-v21.xml, adicionar o attr do windowTranslucent:
Styles-v19.xml, v21:
<resources>
<item name="android:windowTranslucentStatus">true</item>
</resources>
E finalmente, no seu dimens, dimens-v19, dimens-v21, adicione os valores para a barra de ferramentas topMargin, e a altura da barra de estado: dimens.xml para inferior a KitKat:
<resources>
<dimen name="toolbarElevation">4dp</dimen>
<dimen name="appBarTopMargin">0dp</dimen>
<dimen name="statusBarHeight">0dp</dimen>
</resources>
A altura da barra de Estado é sempre 24dp dimens-v19.xml para o KitKat e acima:
<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>
Dimens-v21.xml para o Lolipop, basta adicionar a elevação se necessário:
<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>
Este é o resultado do KitKat de gelatina e do Chupa-Chupa.
Basta criar um novo tema em res / values / styles.xml onde você muda a "colorPrimaryDark" que é a cor da barra de Estado:
<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimaryDark">@color/colorGray</item>
</style>
E modificar o tema de actividade em AndroidManifest.xml para o que quiser, na próxima actividade poderá mudar a cor de volta para a original, seleccionando o tema original:
<activity
android:name=".LoginActivity"
android:theme="@style/AppTheme.GrayStatusBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
É assim que o seu res / valores / cores.o xml deve ser parecido com:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#c6d6f0</color>
<color name="colorGray">#757575</color>
</resources>
Eu tinha este requisito: mudar programaticamente a cor da barra de Estado mantendo-a Transparente , para permitir que a gaveta de navegação desenhasse a si própria sobrepondo a barra de Estado de trasparent.
Não posso fazer isso usando a API
getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)
Se você verificar aqui na pilha overflow todos antes dessa linha de código definir a transparência da barra de Estado para sólido com {[[10]}
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
Sou capaz de gerir a cor e a transparência {[9] } da barra de Estado como isto:
Android 4: não há muito que você possa fazer, porque você não pode gerenciar a cor da barra de estado da API ... a única coisa que você pode fazer é definir a barra de Estado como translúcida e mover um elemento colorido de você UI sob a barra de Estado. Para fazer isso você precisa jogar com Na sua planta principal. Isto permite-lhe desenhar a sua disposição sob a barra de Estado. Então você precisa jogar com algum enchimento com o topo do seu layout principal.
android:fitsSystemWindows="false"
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
Isto permite que a gaveta de navegação sobreponha a barra de Estado.
Depois, para mudar a cor mantendo a barra de estado transparente, terá de definir a cor da barra de estado com
drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))
Onde o drawerLayout é definido desta forma
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
Como @Niels disse Você tem que colocar em valores-v21/styles.xml:
<item name="android:statusBarColor">@color/black</item>
Mas adicione tools:targetApi="lollipop"
Se quiser estilos únicos.xml, como:
<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>
Você pode alterar a cor da barra de estado com esta função. works on android L means API 21 and higher and needs a color string such as "#ffffff"
.
private void changeStatusBarColor(String color){
if (Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.parseColor(color));
}
}
Primeiro, chama o método setStatusBarColored no método oncreato da actividade (pu-lo numa classe util). Eu uso uma imagem aqui, você pode mudá-la para usar uma cor.
public static void setStatusBarColored(Activity context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
Window w = context.getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
int statusBarHeight = getStatusBarHeight(context);
View view = new View(context);
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
view.getLayoutParams().height = statusBarHeight;
((ViewGroup) w.getDecorView()).addView(view);
view.setBackground(context.getResources().getDrawable(R.drawable.navibg));
}
}
public static int getStatusBarHeight(Activity context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
Antes:
A cor da barra de Estado foi alterada, mas a barra de navi está cortada, por isso precisamos fixar a margem ou o desvio da barra navi no método do oncreato.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, (int)(this.getResources().getDimension(R.dimen.navibar_height)));
layoutParams.setMargins(0, Utils.getStatusBarHeight(this), 0, 0);
this.findViewById(R.id.linear_navi).setLayoutParams(layoutParams);
}
Então a barra de Estado ficará assim.
public static void setTaskBarColored(Activity context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
Window w = context.getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//status bar height
int statusBarHeight = Utilities.getStatusBarHeight(context);
View view = new View(context);
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
view.getLayoutParams().height = statusBarHeight;
((ViewGroup) w.getDecorView()).addView(view);
view.setBackgroundColor(context.getResources().getColor(R.color.colorPrimaryTaskBar));
}
}
Mais uma solução:
final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);
Edite o colorprimário nas cores.xml em valores para a cor que deseja que a barra de Estado seja. Por exemplo:
<resources>
<color name="colorPrimary">#800000</color> // changes the status bar color to Burgundy
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#FF0000</color>
<color name="white">#FFFFFF</color>
<color name="cream">#fffdd0</color>
<color name="burgundy">#800000</color>