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.

Author: GuilhE, 2015-04-28

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

introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí

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: introduzca la descripción de la imagen aquí

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

introduzca la descripción de la imagen aquí

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!

 224
Author: GuilhE,
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);
            }
 1
Author: Indika Ruwan Senavirathne,
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