Android: elimine el margen izquierdo del diseño personalizado de la barra de acción

269

Estoy usando una vista de barra de acción personalizada, y como puede ver en la captura de pantalla a continuación, hay un espacio gris en blanco en la barra de acción. Quiero eliminarlo

ingrese la descripción de la imagen aquí

Qué he hecho:

res / values-v11 / styles.xml

<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">
        <item name="android:actionBarStyle">@style/ActionBarStyle</item>
        <item name="actionBarStyle">@style/ActionBarStyle</item>
</style>

res / values ​​/ my_custom_actionbar.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="ActionBarStyle" parent="@style/Widget.AppCompat.Light.ActionBar.Solid">
        <item name="android:height">60dp</item>
    </style>
</resources>

Manifiesto

<uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="19" />

<application
            android:icon="@drawable/ic_launcher"
            android:label="@string/AppName"
            android:theme="@style/AppBaseTheme" >
    <!-- activities... etc -->
</application>

Actividad principal

public void onCreate(Bundle bundle) {
    super.onCreate(bundle);

    ActionBar actionbar = getSupportActionBar();

    actionbar.setDefaultDisplayHomeAsUpEnabled(false);
    actionbar.setDisplayHomeAsUpEnabled(false);
    actionbar.setDisplayShowCustomEnabled(true);
    actionbar.setDisplayShowHomeEnabled(false);
    actionbar.setDisplayShowTitleEnabled(false);
    actionbar.setDisplayUseLogoEnabled(false);
    actionbar.setHomeButtonEnabled(false);

    // Add the custom layout
    View view = LayoutInflater.from(this).inflate(R.layout.actionbar, null, false);
    actionbar.setCustomView(view);
}

He encontrado una publicación reciente, que señala que hay un problema con la última versión. También he actualizado ADT y SDK a Android 5.

La vista personalizada de Android ActionBar no llena al padre

No se que debo hacer.

Editar (solución parcial):

No funciona en Android <= API 10.

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

¿Qué he cambiado?

Use la última versión de SDK:

<uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="21" />

Añadir un toolbarStyle:

<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">
        <item name="android:actionBarStyle">@style/ActionBarStyle</item>
        <item name="actionBarStyle">@style/ActionBarStyle</item>

        <item name="android:toolbarStyle">@style/ToolbarStyle</item>
        <item name="toolbarStyle">@style/ToolbarStyle</item>
</style>

<style name="ToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
    <item name="contentInsetStart">0dp</item>
    <item name="android:contentInsetStart">0dp</item>
</style>
Zbarcea Christian
fuente
1
¿Has visto esta publicación
Kaushik
1
@ Zbarcea No está funcionando en mi extremo. y para Android: toolbarStyle IDE quejas sobre requieren un nivel de API 21 min es 11. ¿Esta solución funciona para usted?
Programador el

Respuestas:

609

Si está agregando el Toolbarvía XML, simplemente puede agregar atributos XML para eliminar insertos de contenido.

<android.support.v7.widget.Toolbar
    xmlns:app="schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/primaryColor"
    android:contentInsetLeft="0dp"
    android:contentInsetStart="0dp"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    android:contentInsetRight="0dp"
    android:contentInsetEnd="0dp"
    app:contentInsetRight="0dp"
    app:contentInsetEnd="0dp" />
LukeWaggoner
fuente
2
xmlns: app = " schemas.android.com/apk/res-auto " para todos los que faltan parte de 'app' de xml.
Prakash
3
¿Cuál es la diferencia entre usar "app:" y "android:" ..?
Micro
3
Son diferentes espacios de nombres. el espacio de nombres "android" se usa tradicionalmente para todos los atributos definidos por el sistema operativo Android. El espacio de nombres "aplicación" se usa tradicionalmente para los atributos definidos por su aplicación, ya sea mediante la importación de bibliotecas o agregando la suya propia en el archivo attrs.xml. Tenga en cuenta que el "identificador" del espacio de nombres puede ser lo que desee, se define utilizando el atributo xmlns en su diseño raíz o, en este caso, en el elemento de diseño en sí. Puede hacerlo "xmlns: turrón" si lo desea. es decir, en el enlace de datos de Android, normalmente uso "bind" para enlazar adaptadores.
LukeWaggoner
@idratherbeintheair Tengo una vista de búsqueda en la barra de herramientas, pero cuando la oculto usando visibilidad, el borde significa que el límite de la vista de búsqueda significa que todavía se muestra un tipo de borde en la barra de herramientas. alguna idea sobre eso?
Jay Rathod RJ
24
en mi caso, agregar este atributo al diseño xml de android.support.v7.widget.Toolbar: app:contentInsetStartWithNavigation="0dp"fue suficiente.
computingfreak
198

prueba esto:

    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setDisplayShowTitleEnabled(false);
    View customView = getLayoutInflater().inflate(R.layout.main_action_bar, null);
    actionBar.setCustomView(customView);
    Toolbar parent =(Toolbar) customView.getParent();
    parent.setPadding(0,0,0,0);//for tab otherwise give space in tab
    parent.setContentInsetsAbsolute(0,0);

Usé este código en mi proyecto, buena suerte;

cocotyty
fuente
44
¡Excelente! parent.setContentInsetsAbsolute (0,0) hace el truco!
Bam
77
Esto funciona. Sin embargo, puede cambiar un poco el diseño. Alternativamente, puede hacerlo en actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0);lugar de inflar el diseño.
Markymark
No funciona para mí, aunque mi problema es un poco diferente.
Consuelo
La función setContentInsetsAbsolute solo se admite si SDK> 21. Cualquier solución
Pramod J George
11
tuvo que agregar parent.setPadding(0, 0, 0, 0);para tabletas también
Alexandre G
47

El recuadro izquierdo es causado por la barra de herramientas contentInsetStart que por defecto es 16dp.

Cambie esto para alinearse con la línea clave.

Actualización para la biblioteca de soporte v24.0.0:

Para que coincida con la especificación de diseño de material hay un atributo adicional contentInsetStartWithNavigation que, de forma predeterminada, es 16dp. Cambie esto si también tiene un icono de navegación.

Resultó que esto es parte de una nueva especificación de diseño de materiales introducida en la versión 24 de la biblioteca de diseño.

https://material.google.com/patterns/navigation.html

Sin embargo, es posible eliminar el espacio extra agregando la siguiente propiedad al widget Barra de herramientas.

app:contentInsetStartWithNavigation="0dp"

Antes de : ingrese la descripción de la imagen aquí

Después : ingrese la descripción de la imagen aquí

Naveen Kumar M
fuente
esta solución es lo que funcionó para mí usando Android Jetpack (androidx)
Francisc0
27

Encontré otra resolución (referencia appcompat-v7) que cambia el toolbarStyle, siguiendo el código:

<item name="toolbarStyle">@style/Widget.Toolbar</item>


<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>
madhu527
fuente
Por favor, eche un vistazo a este stackoverflow.com/questions/31359608/… , si puede ayudarme.
Prashant Kedia
Lo comprobaré y te dejaré saber
madhu527
14
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentInsetLeft="0dp"
app:contentInsetStart="0dp"
android:paddingLeft="0dp">

Esto debería ser lo suficientemente bueno.

Prakash
fuente
11

Simplemente modifique sus styles.xml

<!-- ActionBar styles -->
    <style name="MyActionBar" parent="Widget.AppCompat.ActionBar">
        <item name="contentInsetStart">0dp</item>
        <item name="contentInsetEnd">0dp</item>
    </style>
Nilesh Senta
fuente
8

En lugar de agregar una barra de herramientas en el diseño, puede configurar su vista personalizada como se muestra a continuación.

Toolbar parent = (Toolbar) customView.getParent();
parent.setContentInsetsAbsolute(0,0);
Raja Jawahar
fuente
7

Solo agregar app:contentInsetStart="0dp" a la barra de herramientas, elimine ese espacio restante.

Entonces su definición de la barra Google se ve así

 <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    app:contentInsetStart="0dp"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

y se ve así

ingrese la descripción de la imagen aquí

Keyur
fuente
4

Usando AppCompatAcitivtypuedes usar solo por

Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
View logo = getLayoutInflater().inflate(R.layout.custom_toolbar, null);
mToolbar.addView(logo, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mToolbar.setContentInsetsAbsolute(0,0);
pez muerto
fuente
3

Debe agregar esta línea app2: contentInsetStart = "0dp" en su barra de herramientas

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app2="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    app2:contentInsetStart="0dp"/>
Rahul
fuente
2
Para mí fue app:contentInsetStart="0dp"
Adil Soomro
1

No encontré una solución para mi problema (primera imagen) en ninguna parte, pero al final termino con una solución más simple después de unas horas de excavación. Tenga en cuenta que probé con muchos atributos xml comoapp:setInsetLeft="0dp" , etc. pero ninguno de ellos me ayudó en este caso.

Foto 1 ingrese la descripción de la imagen aquí

El siguiente código resolvió este problema como en la Imagen 2

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    //NOTE THAT: THE PART SOLVED THE PROBLEM.
    android.support.design.widget.AppBarLayout abl = (AppBarLayout)
            findViewById(R.id.app_bar_main_app_bar_layout);

    abl.setPadding(0,0,0,0);
}

Imagen 2

ingrese la descripción de la imagen aquí

mifthi
fuente
1

Establecer los atributos "contentInset ..." en 0 en la barra de herramientas no funcionó para mí. ¡La solución de Nilesh Senta para actualizar el estilo funcionó!

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionBarStyle">@style/Actionbar</item>
    <item name="android:titleTextStyle">@style/ActionbarTitle</item>
</style>

<style name="Actionbar" parent="Widget.AppCompat.ActionBar">
    <item name="contentInsetStart">0dp</item>
    <item name="contentInsetEnd">0dp</item>
</style>

java (onCreate)

ActionBar actionBar =  getSupportActionBar();

actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);

ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(
            ActionBar.LayoutParams.MATCH_PARENT,
            ActionBar.LayoutParams.MATCH_PARENT
    );

View view = LayoutInflater.from(this).inflate(R.layout.actionbar_main, null);

actionBar.setCustomView(view, layoutParams);
Poseidón
fuente
0

Crea una barra de herramientas como esta:

<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/menuToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="0dp"
android:background="@color/white"
android:contentInsetLeft="10dp"
android:contentInsetRight="10dp"
android:contentInsetStart="10dp"
android:minHeight="?attr/actionBarSize"
android:padding="0dp"
app:contentInsetLeft="10dp"
app:contentInsetRight="10dp"
app:contentInsetStart="10dp"></android.support.v7.widget.Toolbar>

siga este enlace para obtener más información - Consejos de Android

Aneh Thakur
fuente
0

solo agregando android:padding="0dp"trabajo para mí

<android.support.v7.widget.Toolbar
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:padding="0dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
Víctor
fuente
0
ActionBar ab = getSupportActionBar();
ab.setDisplayShowHomeEnabled(true);
      ab.setDisplayShowCustomEnabled(true);
      setDisplayShowTitleEnabled(true);
      View customView =     getLayoutInflater().inflate(R.layout.activity_main,null); //here activity_main.xml is the GUI design file.
ab.setCustomView(customView);
Toolbar parent =(Toolbar) customView.getParent(); //use V7 Toolbar import
parent.setContentInsetsAbsolute(0, 0);
setPadding(5,0,0,0);

ab.setIcon(R.mipmap.ic_launcher);

fuente
0

Puede usar el diseño relativo dentro del grupo de vista de la barra de herramientas en su archivo xml y ajustar las posiciones de los widgets según lo requiera para su caso de uso. No es necesario crear un diseño personalizado e inflarlo y adjuntarlo a la barra de herramientas. Una vez hecho esto en su código java, use setContentInsetsAbsolute (0,0) con su objeto de barra de herramientas antes de configurarlo como barra de acción de soporte en su diseño.

Soumyadeb Chattopadhyay
fuente
0

Sería mejor agregar un elemento de fondo al estilo de la barra de acción de la aplicación para que sea coherente con el color de fondo de la barra de acción personalizada:

<item name="android:background">@color/actionbar_bgcolor</item>

Después de Android 6.0, la barra de acción incluso tiene un espacio de margen derecho y no se puede configurar. Agregue un margen derecho ajustando en la actividad de esta manera: (la vista es la barra de acción personalizada o un botón derecho en ella)

int rightMargin = Build.VERSION.SDK_INT>=Build.VERSION_CODES.M ? 0 : 8; // may the same with actionbar leftMargin in px
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
p.setMargins(p.leftMargin, p.topMargin, rightMargin, p.bottomMargin);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
    p.setMarginEnd(rightMargin);
}
view.setLayoutParams(p);

El machenism actionbar solo es compatible después de la aplicación Android 3.0+. Si usamos una barra de herramientas (de soporte lib v7) en su lugar, deberíamos diseñarla en cada xml de cada actividad, y ocuparnos del problema de la superposición con la barra de estado del sistema en el dispositivo Android 5.0 o posterior.

Shrdi
fuente
0

Kotlin

    supportActionBar?.displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM;
    supportActionBar?.setCustomView(R.layout.actionbar);

    val parent = supportActionBar?.customView?.parent as Toolbar
    parent?.setPadding(0, 0, 0, 0)//for tab otherwise give space in tab
    parent?.setContentInsetsAbsolute(0, 0)
Chen Jiling
fuente
0

este trabajo para mi

toolbar.setPadding(0,0,0,0);
toolbar.setContentInsetsAbsolute(0,0);
Maysam R
fuente
0

Si revisa la documentación de la barra de herramientas, por defecto tiene un estilo definido y hay un elemento contentInsetStart.

<item name="contentInsetStart">16dp</item>

Si desea anular este relleno, puede hacerlo de dos maneras.

1.Sobre el estilo y agregue su propio estilo con los valores contentInsetStart y contentInsetEnd

<style name="MyActionBar" parent="Widget.AppCompat.ActionBar">
    <item name="contentInsetStart">0dp</item>
    <item name="contentInsetEnd">0dp</item>
</style>

2.En XML puede definir directamente los valores contentInsetStart y contentInsetEnd

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    android:layout_height="?attr/actionBarSize">

    <!--Add your views here-->

</androidx.appcompat.widget.Toolbar>
Sharath kumar
fuente
-1

¿Su aplicación es compatible con Android 5? Si no es compatible, puede degradar la versión de support actionbar v7. Se parece a:

compile 'com.android.support:appcompat-v7:19.0.+' (No use v7: 21+)

También haga que la versión de destino de la aplicación sea inferior a 21.

targetSdkVersion 14

Si su aplicación es compatible con Android 5 -> necesitará una barra de herramientas personalizada. (Porque appcombat-v7: 21 tiene algún cambio).

quangson91
fuente