studio - Barra de estado transparente de Android y barra de acción
manual de programacion android pdf (2)
Es compatible después de KITKAT. Simplemente agregue el siguiente código dentro del método onCreate de su Actividad. No necesita modificaciones 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);
}
Hice algunas investigaciones sobre este tema y no pude encontrar una solución completa, así que, paso a paso y con un poco de prueba y error, finalmente descubrí cómo podemos lograr estos resultados: tener una
Actionbar
y una
Actionbar
transparentes o coloreadas .
Mira mi respuesta a continuación.
Estoy desarrollando una aplicación que debe ser similar en todos los dispositivos con> = API14 cuando se trata de la barra de acción y la personalización de la barra de estado. Finalmente encontré una solución y, como me tomó un poco de tiempo, la compartiré para salvar algunas de las suyas. Comenzamos usando una dependencia appcompat-21.
Barra de acción transparente
:
valores / styles.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>
values-v21 / styles.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 usar estos temas en su
AndroidManifest.xml
para especificar qué actividades tendrán una
ActionBar
transparente o de color:
<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 la
Actionbar
transparente, también debe tener la
Statusbar
transparente, 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, solo 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 notarás un resultado funky:
Esto sucede porque cuando la
Statusbar
es transparente, el diseño utilizará 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 que se coloque debajo de la Barra de acciones:
...
<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 la vista del contenedor de diseño de lo que queramos que se coloque debajo de la
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 utilicé una
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: esta es una
abstract class
que extiende
ActionBarActivity
¡Espero eso ayude!