Android: rimuovi il margine sinistro dal layout personalizzato della barra delle azioni


269

Sto usando una vista della barra delle azioni personalizzata e, come puoi vedere nello screenshot qui sotto, c'è uno spazio grigio nella barra delle azioni. Voglio rimuoverlo.

inserisci qui la descrizione dell'immagine

Cosa ho fatto:

res / valori-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 / valori / 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>

Manifesto

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

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

Ho trovato un post recente, che indica che c'è un problema con l'ultima versione. Ho anche aggiornato ADT e SDK su Android 5.

La visualizzazione personalizzata di Android ActionBar non riempie il genitore

Non so cosa dovrei fare.

Modifica (soluzione parziale):

Non funziona su Android <= API 10.

Android Lollipop, AppCompat ActionBar vista personalizzata non occupa l'intera larghezza dello schermo

Cosa ho cambiato:

Usa l'ultima versione di sdk:

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

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

1
hai visto questo post
Kaushik l'

1
@Zbarcea Non funziona alla mia fine. e per Android: i reclami IDE di toolbarStyle su richiedono un livello di API 21 min è 11. Questa soluzione funziona per te?
Programmatore

Risposte:


609

Se si sta aggiungendo Toolbarvia XML, è possibile semplicemente aggiungere attributi XML per rimuovere gli inserti di contenuto.

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

2
xmlns: app = " schemas.android.com/apk/res-auto " per tutti coloro a cui manca la parte 'app' di xml.
Prakash,

3
Qual è la differenza tra l'utilizzo di "app:" e "android:" ..?
Micro

3
Sono spazi dei nomi diversi. lo spazio dei nomi "android" è tradizionalmente usato per tutti gli attributi definiti dal sistema operativo Android. Lo spazio dei nomi "app" viene utilizzato tradizionalmente per gli attributi definiti dalla tua app, sia attraverso l'importazione delle librerie, sia aggiungendo le tue nel file attrs.xml. Tieni presente che lo spazio dei nomi "handle" può essere quello che vuoi che sia, è definito usando l'attributo xmlns sul tuo layout di root o, in questo caso, nell'elemento di layout stesso. Potresti farlo "xmlns: nougat" se lo desideri. vale a dire nel database di Android, in genere utilizzo "bind" per bindingAdapters.
LukeWaggoner,

@idratherbeintheair Ho una vista di ricerca nella barra degli strumenti, ma quando la nascondo usando la visibilità il bordo significa che il bordo della vista di ricerca indica che il tipo di bordo è ancora visualizzato sulla barra degli strumenti. qualche idea al riguardo?
Jay Rathod RJ,

24
nel mio caso, l'aggiunta di questo attributo al design xml di android.support.v7.widget.Toolbar: è app:contentInsetStartWithNavigation="0dp"stata sufficiente.
computingfreak

198

prova questo:

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

Ho usato questo codice nel mio progetto, buona fortuna;


4
Eccellente! parent.setContentInsetsAbsolute (0,0) fa il trucco!
Bam,

7
Questo funziona Tuttavia, può cambiare un po 'il layout. In alternativa, puoi fare actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0);piuttosto che gonfiare il layout.
Markymark,

Non funziona per me, anche se il mio problema è leggermente diverso.
Solace,

La funzione setContentInsetsAbsolute è supportata solo se SDK> 21. Qualsiasi soluzione
Pramod J George,

11
ho dovuto aggiungere anche parent.setPadding(0, 0, 0, 0);per i tablet
Alexandre G,

47

L'inserto sinistro è causato dalla barra degli strumenti contentInsetStartche per impostazione predefinita è 16dp.

Modificalo per allinearlo alla linea chiave.

Aggiornamento per la libreria di supporto v24.0.0:

Per abbinare le specifiche di Material Design c'è un attributo aggiuntivo contentInsetStartWithNavigationche per impostazione predefinita è 16dp. Cambia questo se hai anche un'icona di navigazione.

Si è scoperto che questo fa parte di una nuova specifica di progettazione dei materiali introdotta nella versione 24 della libreria di progettazione.

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

Tuttavia, è possibile rimuovere lo spazio aggiuntivo aggiungendo la seguente proprietà al widget Barra degli strumenti.

app:contentInsetStartWithNavigation="0dp"

Prima : inserisci qui la descrizione dell'immagine

Dopo : inserisci qui la descrizione dell'immagine


questa soluzione è ciò che ha funzionato per me utilizzando Android Jetpack (androidx)
Francisc0

27

Ho trovato un'altra risoluzione (riferimento appcompat-v7) che modifica la barra degli strumenti Stile, seguendo il codice:

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


<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>

Per favore date un'occhiata a questo stackoverflow.com/questions/31359608/… , se poteste aiutarmi.
Prashant Kedia,

controllerò e ti lascerò conoscere
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">

Questo dovrebbe essere abbastanza buono.


11

Modifica il tuo styles.xml

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

8

Invece di aggiungere una barra degli strumenti nel layout, è possibile impostare la vista personalizzata come mostrato di seguito.

Toolbar parent = (Toolbar) customView.getParent();
parent.setContentInsetsAbsolute(0,0);

7

Aggiungi solo app:contentInsetStart="0dp"alla barra degli strumenti rimuove quello spazio lasciato.

Quindi la definizione della barra degli strumenti è simile a questa

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

e sembra così

inserisci qui la descrizione dell'immagine


4

Usando AppCompatAcitivtypuoi usare solo per

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

3

Devi aggiungere questa riga app2: contentInsetStart = "0dp" nella barra degli strumenti

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

2
Per me lo era app:contentInsetStart="0dp"
Adil Soomro,

1

Non ho trovato una soluzione al mio problema (prima foto) da nessuna parte, ma alla fine ho finito con una soluzione più semplice dopo alcune ore di scavo. Si noti che ho provato con molti attributi xml come app:setInsetLeft="0dp", ecc., Ma nessuno di questi ha aiutato in questo caso.

Immagine 1 inserisci qui la descrizione dell'immagine

il codice seguente ha risolto questo problema come nella figura 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);
}

Immagine 2

inserisci qui la descrizione dell'immagine


1

L'impostazione degli attributi "contentInset ..." su 0 nella barra degli strumenti non ha funzionato per me. La soluzione di Nilesh Senta per aggiornare lo stile ha funzionato!

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

0

Crea barra degli strumenti in questo modo:

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

segui questo link per ulteriori informazioni - Suggerimenti per Android


0

aggiungendo solo android:padding="0dp"lavoro per me

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

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

0

Puoi semplicemente utilizzare il layout relativo all'interno del gruppo di visualizzazione della barra degli strumenti nel tuo file xml e regolare le posizioni dei widget in base alle esigenze per il tuo caso d'uso. Non è necessario creare layout personalizzati, gonfiarli e collegarli alla barra degli strumenti. Una volta fatto nel tuo codice Java, usa setContentInsetsAbsolute (0,0) con l'oggetto barra degli strumenti prima di impostarlo come barra delle azioni di supporto nel layout.


0

Sarebbe meglio aggiungere un elemento di sfondo nello stile della barra delle azioni dell'app in modo che corrisponda al colore di sfondo della barra delle azioni personalizzata:

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

Dopo Android 6.0, la barra delle azioni ha persino uno spazio margine destro e non può essere impostata. Aggiungi un margine destro che regola l'attività in questo modo: (la vista è la barra delle azioni personalizzata o un pulsante destro in essa)

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

Il machenismo della barra delle azioni è supportato solo dopo l'app Android 3.0+. Se invece utilizziamo una barra degli strumenti (di supporto lib v7), dovremmo layout in ogni xml di ogni attività e occuparci del problema della sovrapposizione con la barra di stato del sistema nel dispositivo Android 5.0 o successivo.


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)

0

questo lavoro per me

toolbar.setPadding(0,0,0,0);
toolbar.setContentInsetsAbsolute(0,0);

0

Se si controlla la documentazione della barra degli strumenti, per impostazione predefinita ha lo stile definito e c'è un elemento contentInsetStart.

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

Se vuoi sovrascrivere questa imbottitura, puoi farlo in due modi.

1. Sovrascrivi lo stile e aggiungi il tuo stile con i valori contentInsetStart e contentInsetEnd

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

2.In XML è possibile definire direttamente i valori contentInsetStart e 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>

-1

La tua app supporta Android 5? In caso contrario, è possibile eseguire il downgrade della versione della barra di azione di supporto v7. Sembra che:

compilare 'com.android.support:appcompat-v7:19.0.+' (Non utilizzare v7: 21+)

anche rendere la versione di destinazione dell'applicazione inferiore a 21.

targetSdkVersion 14

Se la tua app supporta Android 5 -> avrai bisogno di una barra degli strumenti personalizzata. (Perché appcombat-v7: 21 ha qualche modifica).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.