personalizar - Android Lollipop, la vista personalizada de AppCompat ActionBar no ocupa todo el ancho de la pantalla
paletas de colores android studio (8)
Creo que también puedes hacerlo en estilos. prueba esto. probado en kitkat
<style name="AppTheme" parent="Theme.AppCompat">
<item name="toolbarStyle">@style/AppThemeToolbar</item>
</style>
<style name="AppThemeToolbar" parent="Widget.AppCompat.Toolbar" >
<item name="contentInsetStart">0dp</item>
</style>
Entonces, acabo de actualizar mi base de código a Lollipop, y tengo problemas con la Barra de acciones. Estoy usando AppCompat y ActionBarActivity, y estoy inflando una vista personalizada. Parece que la vista personalizada ya no ocupa todo el ancho de la pantalla, dejando una tira delgada a la izquierda
Cómo solía verse
Cómo se ve ahora
Este es el código que estoy usando para configurar la barra de acción. ¿Alguien tiene alguna idea?
final ActionBar actionBar = getSupportActionBar();
if(actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setCustomView(R.layout.action_bar_content_search_custom_view);
actionBar.setBackgroundDrawable(null);
// actionBar.setStackedBackgroundDrawable(null);
TextView title = (TextView) actionBar.getCustomView().findViewById(R.id.action_bar_title);
title.setText(R.string.youtube);
ImageView back = (ImageView) actionBar.getCustomView().findViewById(R.id.action_bar_back);
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
Editar
Eliminar la vista personalizada y cambiar el fondo ahora ocupa todo el ancho. Entonces, el problema es, ¿cómo podemos hacer que CustomView ocupe todo el ancho de ActionBar?
Después de mucho golpearme la cabeza contra el monitor, esto funcionó para mí
Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
toolbar.setContentInsetStartWithNavigation(0);
toolbar.setContentInsetEndWithActions(0);
toolbar.setContentInsetsAbsolute(0, 0);
toolbar.setPadding(0, 0, 0, 0);
GetCustomView (). GetParent () es lo que hizo el truco
En lugar de hacer tanto trabajo como mencionó Muzikant y me gusta esta respuesta
getSupportActionBar().setDisplayShowHomeEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
LayoutInflater mInflater = LayoutInflater.from(this);
View mCustomView = mInflater.inflate(R.layout.action_bar_home, null);
getSupportActionBar().setCustomView(mCustomView);
getSupportActionBar().setDisplayShowCustomEnabled(true);
Toolbar parent =(Toolbar) mCustomView.getParent();//first get parent toolbar of current action bar
parent.setContentInsetsAbsolute(0,0);// set padding programmatically to 0dp
Debe agregar solo las dos últimas líneas de código para resolver su problema.
Espero que esto pueda ayudarte a ti y a cualquier otra persona.
ACTUALIZACIÓN: Después de investigar un poco al respecto, descubrí que esta solución no funcionará en algunos casos. El espacio lateral izquierdo (INICIO o ATRÁS) se eliminará con esto, pero el espacio lateral derecho (MENÚ) permanecerá como está. A continuación se muestra la solución en estos casos.
View v = getSupportActionBar().getCustomView();
LayoutParams lp = v.getLayoutParams();
lp.width = LayoutParams.MATCH_PARENT;
v.setLayoutParams(lp);
Agregue estas cuatro líneas al código anterior, de modo que el espacio lateral derecho también se elimine de la barra de acción de soporte.
Escriba estas dos líneas además de su código
Toolbar toolbar=(Toolbar)viewActionBar.getParent();
toolbar.setContentInsetsAbsolute(0,0);
Ninguna de las otras respuestas funcionó para mí, así que eché un vistazo a los estilos reales de AppCompat v7, que se encuentran here .
Si observa el estilo Base.Widget.AppCompat.ActionBar, tiene:
<item name="contentInsetStart">@dimen/abc_action_bar_content_inset_material</item>
<item name="contentInsetEnd">@dimen/abc_action_bar_content_inset_material</item>
Entonces, obviamente, solo tenemos que anular esas propiedades en nuestro propio estilo de barra de acción:
<style name="ActionBar" parent="@style/Base.Widget.AppCompat.ActionBar">
<item name="contentInsetStart">0dp</item>
<item name="contentInsetEnd">0dp</item>
</style>
Esto funcionó muy bien para mí, espero que también ayude a otros.
Parece que esto es causado por los últimos cambios en
ActionBar
en la
appcompat-v7
reciente de
appcompat-v7
.
Parece que hay cambios significativos en cómo debe manejar las barras de acción.
Me enfrenté al mismo problema y después de leer la
documentación de
ActionBar
, y especialmente la siguiente cita, encontré una solución.
A partir de Android L (API nivel 21), la barra de acción puede estar representada por cualquier widget de barra de herramientas dentro del diseño de la aplicación. La aplicación puede indicar a la actividad qué barra de herramientas debe tratarse como la barra de acción de la actividad. Las actividades que usan esta función deben usar uno de los temas .NoActionBar suministrados, establecer el atributo windowActionBar en falso o de lo contrario no solicitar la función de ventana.
A mi modo de ver, los temas de
AppCompat
cambiaron y, por un lado, parecían romper algunas cosas, pero por otro lado, proporcionaban mucha más flexibilidad.
Recomiendo seguir estos pasos:
-
Use el estilo
.NoActionBar
en su actividad como se describe en la cita anterior -
Agregue un
android.support.v7.widget.Toolbar
a su diseño de Actividad -
Establezca la
app:contentInsetStart="0dp"
atributo. Este es el problema principal con el margen que describe en su pregunta
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/actionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentInsetEnd="0dp"
app:contentInsetStart="0dp" >
</android.support.v7.widget.Toolbar>
Por lo general, se recomienda que lo haga en un archivo de diseño separado y use
include
en el diseño de su actividad, por lo que solo necesitará personalizar la barra de herramientas en un lugar si se usa en múltiples actividades
<include layout="@layout/view_action_bar" />
-
Use
findViewById
ysetSupportActionBar
en su ActivityonCreate
parasignal to the Activity which Toolbar should be treated as the Activity''s action bar
Toolbar actionBar = (Toolbar) findViewById(R.id.actionBar);
setSupportActionBar(actionBar);
-
Una vez que haga eso, todas las acciones agregadas en
onCreateOptionsMenu
se agregarán a la barra de herramientas y se tratarán como la barra de acción. - Personalice aún más la barra de herramientas como desee (Agregar vistas secundarias, etc.)
También encontré este problema hoy, luego descubrí que tenía
res/values-v21/styles.xml
dentro de mi proyecto, que fue generado automáticamente por Android Studio y esa es la causa.
¿Por qué?
Porque el contenido de mi
res/values-v21/styles.xml
era:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="BaseAppTheme" parent="android:Theme.Material.Light">
</style>
</resources>
Y mi
res/values/styles.xml
contenía algo como:
<style name="BaseAppTheme" parent="android:Theme.Holo.Light">
<!-- Customize your theme here. -->
<item name="android:windowContentOverlay">@null</item>
<item name="android:soundEffectsEnabled">false</item>
</style>
Luego, cuando ejecuté mi aplicación en Lollipop, se utilizó
res/values-v21/styles.xml
, y eso causó el problema exacto que tenía OP.
Así que llegué a una solución simple, solo estoy eliminando:
<style name="BaseAppTheme" parent="android:Theme.Material.Light">
</style>
en
res/values-v21/styles.xml
al punto:
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
actionBar.setCustomView(R.layout.actionbar_layout);
Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
toolbar.setContentInsetsAbsolute(0, 0);
toolbar.setPadding(0, 0, 0, 0);
asegúrese de importar la barra de herramientas correcta:
android.support.v7.widget.Toolbar;