La vista personalizada de Android Lollipop, AppCompat ActionBar no ocupa todo el ancho de pantalla

Por lo tanto, acabo de actualizar mi base de código a Lollipop, y tengo problemas con la barra de acción. Estoy usando AppCompat y ActionBarActivity, e 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

Construyendo con 19 Como solía ser

Construyendo con 21 Cómo se ve ahora

Este es el código que estoy usando para configurar la barra de acciones. ¿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

Sacar la vista personalizada y cambiar el fondo ahora ocupa todo el ancho. Entonces, el problema es, ¿cómo podemos hacer que una vista personalizada ocupe todo el ancho de la barra de acciones?

Parece que esto es causado por los últimos cambios en ActionBar en la reciente appcompat-v7 . Parece que hay cambios significativos en cómo debe manejar las barras de acción.

ActionBar el 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 (nivel de API 21), la barra de acciones puede representarse mediante cualquier widget de la 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 característica deben usar uno de los temas .NoActionBar provistos, establecer el atributo windowActionBar en falso o de lo contrario no solicitar la función de ventana.

De la forma en que lo veo, los temas de AppCompat se cambiaron y, por un lado, parecieron romper algunas cosas pero proporcionar mucha más flexibilidad en el otro. Recomiendo seguir estos pasos:

  1. Use el estilo .NoActionBar en su actividad como se describe en la cita anterior
  2. Agregue un android.support.v7.widget.Toolbar al diseño de su actividad
  3. Establezca el app:contentInsetStart="0dp" . Este es el principal problema con el margen que describes en tu pregunta
   

Por lo general, se recomienda que haga eso en un archivo de diseño separado y use include en el diseño de su actividad, de modo que solo necesitará personalizar la barra de herramientas en un solo lugar si se usa en múltiples actividades.

  
  1. Use findViewById y setSupportActionBar en su Activity onCreate para signal to the Activity which Toolbar should be treated as the Activity's action bar
 Toolbar actionBar = (Toolbar) findViewById(R.id.actionBar); setSupportActionBar(actionBar); 
  1. Una vez que lo haga, todas las acciones agregadas en onCreateOptionsMenu se agregarán a la barra de herramientas y se tratarán como la barra de acciones de actividades.
  2. Personalice aún más la barra de herramientas como desee (Agregar vistas secundarias, etc.)

En lugar de hacer tanto trabajo como lo menciona Muzikant y como 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 

Tienes que agregar solo las dos últimas líneas de código para resolver tu problema.

Espero que esto te pueda ayudar a ti y a cualquier otra persona.

ACTUALIZACIÓN: después de investigar un poco, descubrí que esta solución no funcionará en algunos casos. El espacio del lado izquierdo (HOGAR o ATRÁS) se eliminará con esto, pero el espacio lateral derecho (MENÚ) permanecerá como está. A continuación está 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 la separación del lado derecho también se elimine de la barra de acciones de soporte.

Creo que también puedes hacer eso en estilos. prueba esto. probado en kitkat

   

Ninguna de las otras respuestas funcionó para mí, así que eché un vistazo a los estilos reales de AppCompat v7, que se encuentran aquí .

Si observa el estilo Base.Widget.AppCompat.ActionBar, tiene:

 @dimen/abc_action_bar_content_inset_material @dimen/abc_action_bar_content_inset_material 

Así que, obviamente, solo tenemos que anular esas propiedades en nuestro propio estilo de barra de acción:

  

Esto funcionó muy bien para mí, espero que ayude a otros también.

Acabo de encontrar este problema hoy también, luego descubrí que estaba teniendo res/values-v21/styles.xml dentro de mi proyecto que fue generado automáticamente por Android Studio y esa es la causa.

¿Por qué?

Debido a que el contenido de mi res/values-v21/styles.xml era:

 < ?xml version="1.0" encoding="utf-8"?>    

Y mi res/values/styles.xml contenía algo como:

  

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: simplemente eliminar:

   

en res/values-v21/styles.xml

Después de mucho golpear mi 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); 

El getCustomView (). GetParent () es lo que hizo el truco

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;

Escribe estas dos líneas además de tu código

 Toolbar toolbar=(Toolbar)viewActionBar.getParent(); toolbar.setContentInsetsAbsolute(0,0);