Barra de estado transparente y barra de acción de Android
He hecho algunas investigaciones sobre este tema y no pude encontrar una solución completa, así que paso a paso y con un poco de ensayo y error, finalmente averiguo cómo podemos lograr estos resultados: tener un Actionbar
transparente o de color y Statusbar
. Mira mi respuesta a continuación.
2 answers
Estoy desarrollando una aplicación que necesita tener un aspecto similar en todos los dispositivos con >= API14 cuando se trata de la personalización de actionbar y statusbar. Finalmente he encontrado una solución y ya que me tomó un poco de mi tiempo la compartiré para salvar a algunos de los tuyos. Comenzamos usando una dependencia appcompat - 21.
Barra de acción transparente:
valores / estilos.xml :
<style name="AppTheme" parent="Theme.AppCompat.Light">
...
</style>
<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
<item name="android:windowContentOverlay">@null</item>
<item name="windowActionBarOverlay">true</item>
<item name="colorPrimary">@android:color/transparent</item>
</style>
<style name="AppTheme.ActionBar" parent="AppTheme">
<item name="windowActionBarOverlay">false</item>
<item name="colorPrimary">@color/default_yellow</item>
</style>
valores-v21/estilos.xml :
<style name="AppTheme" parent="Theme.AppCompat.Light">
...
</style>
<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
<item name="colorPrimary">@android:color/transparent</item>
</style>
<style name="AppTheme.ActionBar" parent="AppTheme">
<item name="colorPrimaryDark">@color/bg_colorPrimaryDark</item>
<item name="colorPrimary">@color/default_yellow</item>
</style>
Ahora puede utilizar estos temas en su AndroidManifest.xml
para especificar qué actividades tendrán un color transparente ActionBar
:
<activity
android:name=".MyTransparentActionbarActivity"
android:theme="@style/AppTheme.ActionBar.Transparent"/>
<activity
android:name=".MyColoredActionbarActivity"
android:theme="@style/AppTheme.ActionBar"/>
Nota: en API>=21 para obtener el Actionbar
transparente, necesita obtener el Statusbar
transparente también, de lo contrario no respetará sus estilos de color y permanecerá gris claro.
Barra de estado transparente (solo funciona con API>=19):
Este es bastante simple simplemente use el siguiente código:
protected void setStatusBarTranslucent(boolean makeTranslucent) {
if (makeTranslucent) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
Pero te darás cuenta un resultado funky:
Esto sucede porque cuando el Statusbar
es transparente, el diseño usará su altura. Para evitar esto solo necesitamos:
SOLUCIÓN UNO:
Agregue esta línea android:fitsSystemWindows="true"
en su contenedor de vista de diseño de lo que quiera colocar debajo de la Barra de acción:
...
<LinearLayout
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</LinearLayout>
...
SOLUCIÓN DOS:
Agregue algunas líneas a nuestro método anterior:
protected void setStatusBarTranslucent(boolean makeTranslucent) {
View v = findViewById(R.id.bellow_actionbar);
if (v != null) {
int paddingTop = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? MyScreenUtils.getStatusBarHeight(this) : 0;
TypedValue tv = new TypedValue();
getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, tv, true);
paddingTop += TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
v.setPadding(0, makeTranslucent ? paddingTop : 0, 0, 0);
}
if (makeTranslucent) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
Donde R.id.bellow_actionbar
será el id de vista del contenedor de diseño de lo que queremos ser colocado debajo del Actionbar
:
...
<LinearLayout
android:id="@+id/bellow_actionbar"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</LinearLayout>
...
Así que esto es todo, creo que no estoy olvidando algo.
En este ejemplo no usé un Toolbar
pero creo que tendrá el mismo resultado. Así es como personalizo mi Actionbar
:
@Override
protected void onCreate(Bundle savedInstanceState) {
View vg = getActionBarView();
getWindow().requestFeature(vg != null ? Window.FEATURE_ACTION_BAR : Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(getContentView());
if (vg != null) {
getSupportActionBar().setCustomView(vg, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayUseLogoEnabled(false);
}
setStatusBarTranslucent(true);
}
Nota: este es un abstract class
que se extiende ActionBarActivity
Espero que ayude!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-25 14:36:10
Soporta después de KITKAT. Simplemente agregue el siguiente código dentro del método onCreate de su Actividad. No necesita ninguna modificación en el archivo de manifiesto.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window w = getWindow(); // in Activity's onCreate() for instance
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-07 10:25:20