Estoy desarrollando una aplicación que debe verse similar en todos los dispositivos con> = API14 cuando se trata de la personalización de la barra de acción y la barra de estado. Finalmente encontré una solución y, dado que me tomó un poco de tiempo, la compartiré para guardar algunas de las suyas. 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 / 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 un color transparente o 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 la Actionbar
transparencia, necesita obtener la Statusbar
transparencia también; de lo contrario, no respetará sus estilos de color y permanecerá gris claro.
Barra de estado transparente (solo funciona con API> = 19) :
esta es bastante simple, solo usa 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 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 el contenedor de la vista de diseño de lo que desee 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);
}
}
¿Dónde R.id.bellow_actionbar
estará el ID de vista del contenedor de diseño de lo que queramos colocar debajo de 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 me estoy olvidando de algo. En este ejemplo no utilicé a, 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
extenso ¡ ActionBarActivity
Espero que ayude!