Android: supprimez la marge gauche de la disposition personnalisée de la barre d'actions

269

J'utilise une vue de barre d'action personnalisée, et comme vous pouvez le voir dans la capture d'écran ci-dessous, il y a un espace gris vide dans la barre d'action. Je veux l'enlever.

entrez la description de l'image ici

Qu'est-ce que j'ai fait:

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>

Manifeste

<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>

Activité principale

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);
}

J'ai trouvé un post récent, qui souligne qu'il y a un problème avec la dernière version. J'ai également mis à jour ADT et SDK vers Android 5.

La vue personnalisée d'Android ActionBar ne remplit pas le parent

Je ne sais pas quoi faire.

Modifier (solution partielle):

Ne fonctionne pas sur Android <= API 10.

Android Lollipop, la vue personnalisée AppCompat ActionBar ne prend pas toute la largeur de l'écran

Qu'est-ce que j'ai changé:

Utilisez la dernière version sdk:

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

Ajoutez 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
la source
1
avez-vous vu ce post
Kaushik
1
@Zbarcea Cela ne fonctionne pas de mon côté. et pour android: toolbarStyle Les plaintes concernant l'IDE nécessitent un niveau d'api 21 min est 11. Cette solution fonctionne-t-elle pour vous?
Programmeur

Réponses:

609

Si vous ajoutez le Toolbarvia XML, vous pouvez simplement ajouter des attributs XML pour supprimer les encarts de contenu.

<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
la source
2
xmlns: app = " schemas.android.com/apk/res-auto " pour tous ceux qui manquent une partie "app" de xml.
Prakash
3
Quelle est la différence entre l'utilisation de "app:" et "android:" ..?
Micro
3
Ce sont des espaces de noms différents. l'espace de noms "android" est traditionnellement utilisé pour tous les attributs définis par le système d'exploitation Android. L'espace de noms "app" est traditionnellement utilisé pour les attributs définis par votre application, soit par le biais d'importations de bibliothèques, soit par l'ajout des vôtres dans le fichier attrs.xml. Gardez à l'esprit que le "handle" de l'espace de noms peut être ce que vous voulez qu'il soit, il est défini en utilisant l'attribut xmlns sur votre disposition racine ou, dans ce cas, dans l'élément de disposition lui-même. Vous pouvez le faire "xmlns: nougat" si vous le souhaitez. Par exemple, dans la liaison de données Android, j'utilise généralement "bind" pour bindingAdapters.
LukeWaggoner
@idratherbeintheair J'ai une vue de recherche dans la barre d'outils mais quand je la cache en utilisant la visibilité, la bordure signifie que la limite de la vue de recherche signifie que le type de bordure est toujours affiché sur la barre d'outils. une idée à ce sujet?
Jay Rathod RJ
24
dans mon cas, l'ajout de cet attribut au design xml de android.support.v7.widget.Toolbar: app:contentInsetStartWithNavigation="0dp"était suffisant.
computingfreak
198

essaye ça:

    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);

J'ai utilisé ce code dans mon projet, bonne chance;

cocotyty
la source
4
Excellent! parent.setContentInsetsAbsolute (0,0) fait l'affaire!
Bam
7
Cela marche. Cependant, cela peut changer un peu la disposition. Alternativement, vous pouvez faire actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0);plutôt que de gonfler la mise en page.
Markymark
Ne fonctionne pas pour moi, bien que mon problème soit légèrement différent.
Solace
La fonction setContentInsetsAbsolute n'est prise en charge que si SDK> 21. Toute solution
Pramod J George
11
devait aussi ajouter parent.setPadding(0, 0, 0, 0);pour les tablettes
Alexandre G
47

L'encart de gauche est provoqué par la barre d'outils contentInsetStartqui, par défaut, est 16dp.

Modifiez-le pour l'aligner sur la ligne de touche.

Mise à jour pour la bibliothèque de support v24.0.0:

Pour correspondre à la spécification Material Design, il existe un attribut supplémentaire contentInsetStartWithNavigationqui, par défaut, est 16dp. Modifiez cela si vous avez également une icône de navigation.

Il s'est avéré que cela faisait partie d'une nouvelle spécification de conception de matériaux introduite dans la version 24 de la bibliothèque de conception.

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

Cependant, il est possible de supprimer l'espace supplémentaire en ajoutant la propriété suivante au widget Barre d'outils.

app:contentInsetStartWithNavigation="0dp"

Avant : entrez la description de l'image ici

Après : entrez la description de l'image ici

Naveen Kumar M
la source
cette solution est ce qui a fonctionné pour moi en utilisant Android Jetpack (androidx)
Francisc0
27

J'ai trouvé une autre résolution (référence appcompat-v7) qui modifie le style de la barre d'outils, code suivant:

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


<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>
madhu527
la source
Veuillez jeter un œil à ce stackoverflow.com/questions/31359608/… , si vous pouvez m'aider.
Prashant Kedia
je vais vérifier et vous laisser konw
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">

Cela devrait être suffisant.

Prakash
la source
11

Modifiez simplement vos styles.xml

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

Au lieu d'ajouter une barre d'outils dans la mise en page, vous pouvez définir votre vue personnalisée comme indiqué ci-dessous.

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

Ajouter uniquement app:contentInsetStart="0dp"à la barre d'outils supprimer cet espace laissé.

Ainsi, votre définition de barre d'outils ressemble à ceci

 <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">

et ça ressemble à ça

entrez la description de l'image ici

Keyur
la source
4

En utilisant, AppCompatAcitivtyvous pouvez utiliser simplement en

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);
poisson mort
la source
3

Vous devez ajouter cette ligne app2: contentInsetStart = "0dp" dans votre barre d'outils

<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
la source
2
Pour moi, c'était app:contentInsetStart="0dp"
Adil Soomro
1

Je n'ai trouvé aucune solution à mon problème (première photo) n'importe où, mais je me retrouve finalement avec une solution la plus simple après quelques heures de fouille. Veuillez noter que j'ai essayé avec beaucoup d'attributs xml comme app:setInsetLeft="0dp", etc., mais aucun d'eux n'a aidé dans ce cas.

Image 1 entrez la description de l'image ici

le code suivant a résolu ce problème comme dans l'image 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);
}

Image 2

entrez la description de l'image ici

mifthi
la source
1

La définition des attributs "contentInset ..." à 0 dans la barre d'outils ne fonctionnait pas pour moi. La solution de Nilesh Senta pour mettre à jour le style a fonctionné!

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);
Poséidon
la source
0

Créez une barre d'outils comme celle-ci:

<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>

veuillez suivre ce lien pour en savoir plus - Astuces Android

Aneh Thakur
la source
0

ajoutant seulement du android:padding="0dp"travail pour moi

<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">
Victor
la source
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);

la source
0

Vous pouvez simplement utiliser la disposition relative dans le groupe de vues de la barre d'outils dans votre fichier xml et ajuster les positions des widgets selon vos besoins pour votre cas d'utilisation.Pas besoin de créer une disposition personnalisée et de la gonfler et de l'attacher à la barre d'outils. Une fois terminé dans votre code java, utilisez setContentInsetsAbsolute (0,0) avec votre objet de barre d'outils avant de le définir comme barre d'action de support dans votre mise en page.

Soumyadeb Chattopadhyay
la source
0

Il serait préférable d'ajouter un élément d'arrière-plan dans le style de la barre d'action de l'application pour correspondre à la couleur d'arrière-plan de la barre d'action personnalisée:

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

Après Android 6.0, la barre d'action a même un espace à droite et ne peut pas être définie. Ajoutez une marge droite en ajustant l'activité comme ceci: (la vue est la barre d'actions personnalisée ou un bouton droit dedans)

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);

Le machenisme de la barre d'action est juste pris en charge après l'application Android 3.0+. Si nous utilisons une barre d'outils (de support lib v7) à la place, nous devons la disposer dans chaque xml de chaque activité, et prendre soin du problème de chevauchement avec la barre d'état du système dans l'appareil Android 5.0 ou version ultérieure.

Shrdi
la source
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
la source
0

ce travail pour moi

toolbar.setPadding(0,0,0,0);
toolbar.setContentInsetsAbsolute(0,0);
Maysam R
la source
0

Si vous consultez la documentation de la barre d'outils, par défaut, le style est défini et il existe un élément contentInsetStart.

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

Si vous souhaitez remplacer ce remplissage, cela peut être fait de deux manières.

Remplacez le style et ajoutez votre propre style avec les valeurs contentInsetStart et contentInsetEnd

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

2.En XML, vous pouvez définir directement les valeurs contentInsetStart et 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
la source
-1

Votre application prend-elle en charge Android 5? Si ce n'est pas le cas, vous pouvez rétrograder la version de la barre d'action de support v7. Il semble comme:

compilez 'com.android.support:appcompat-v7:19.0.+' (N'utilisez pas v7: 21+)

également rendre la version cible de l'application inférieure à 21.

targetSdkVersion 14

Si votre application prend en charge Android 5 -> vous aurez besoin de la barre d'outils personnalisée. (Devenir appcombat-v7: 21 ont un certain changement).

quangson91
la source