Android: Entfernen Sie den linken Rand aus dem benutzerdefinierten Layout der Aktionsleiste

269

Ich verwende eine benutzerdefinierte Aktionsleistenansicht. Wie Sie im folgenden Screenshot sehen können, befindet sich in der Aktionsleiste ein leerer grauer Bereich. Ich möchte es entfernen.

Geben Sie hier die Bildbeschreibung ein

Was habe ich gemacht:

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>

Manifest

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

Hauptaktivität

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

Ich habe kürzlich einen Beitrag gefunden, der darauf hinweist, dass es ein Problem mit der neuesten Version gibt. Ich habe auch ADT und SDK auf Android 5 aktualisiert.

Die benutzerdefinierte Ansicht von Android ActionBar füllt das übergeordnete Element nicht aus

Ich weiß nicht, was ich tun soll.

Bearbeiten (Teillösung):

Funktioniert nicht mit Android <= API 10.

Die benutzerdefinierte Ansicht von Android Lollipop, AppCompat ActionBar nimmt nicht die gesamte Bildschirmbreite ein

Was habe ich geändert:

Verwenden Sie die neueste SDK-Version:

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

Fügen Sie hinzu 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
quelle
1
Hast du diesen Beitrag gesehen
Kaushik
1
@ Zbarcea Es funktioniert nicht an meinem Ende. und für Android: ToolbarStyle IDE Beschwerden über erfordern API-Level 21 min ist 11. Funktioniert diese Lösung für Sie?
Programmierer

Antworten:

608

Wenn Sie das Toolbarvia XML hinzufügen , können Sie einfach XML-Attribute hinzufügen, um Inhaltseinfügungen zu entfernen.

<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
quelle
2
xmlns: app = " schemas.android.com/apk/res-auto " für alle, denen der ' app' -Teil von xml fehlt.
Prakash
3
Was ist der Unterschied zwischen "app:" und "android:" ..?
Micro
3
Das sind verschiedene Namespaces. Der Namespace "android" wird traditionell für alle vom Android-Betriebssystem definierten Attribute verwendet. Der Namespace "App" wird traditionell für Attribute verwendet, die von Ihrer App definiert werden, entweder durch Importieren von Bibliotheken oder durch Hinzufügen eines eigenen in der Datei attrs.xml. Beachten Sie, dass der Namespace "Handle" beliebig sein kann. Er wird mithilfe des xmlns-Attributs in Ihrem Root-Layout oder in diesem Fall im Layout-Element selbst definiert. Sie könnten es "xmlns: nougat" machen, wenn Sie wollten. dh In der Android-Datenbindung verwende ich normalerweise "bind" für die Bindung von Adaptern.
LukeWaggoner
@idratherbeintheair Ich habe eine Suchansicht in der Symbolleiste, aber wenn ich sie mit Sichtbarkeit ausblende, bedeutet der Rand, dass die Grenze der Suchansicht bedeutet, dass die Art des Rahmens immer noch in der Symbolleiste angezeigt wird. Hast du eine Idee dazu?
Jay Rathod RJ
24
In meinem Fall war es ausreichend , dieses Attribut zur Design-XML von android.support.v7.widget.Toolbar: hinzuzufügen app:contentInsetStartWithNavigation="0dp".
Computingfreak
198

Versuche dies:

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

Ich habe diesen Code in meinem Projekt verwendet, viel Glück;

Kokotyty
quelle
4
Ausgezeichnet! parent.setContentInsetsAbsolute (0,0) macht den Trick!
Bam
7
Das funktioniert. Es kann jedoch das Layout etwas ändern. Alternativ können Sie actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0);das Layout auch nicht aufblasen.
Markymark
Ich arbeite nicht für mich, obwohl mein Problem nur ein bisschen anders ist.
Trost
Die Funktion setContentInsetsAbsolute wird nur unterstützt, wenn SDK> 21 ist. Jede Lösung
Pramod J George
11
musste auch parent.setPadding(0, 0, 0, 0);für Tabletten hinzufügen
Alexandre G
47

Der linke Einschub wird durch contentInsetStartSymbolleisten verursacht, die standardmäßig 16 dp betragen.

Ändern Sie dies, um es an der Keyline auszurichten.

Update für die Support-Bibliothek v24.0.0:

Um der Material Design-Spezifikation zu entsprechen, gibt es ein zusätzliches Attribut, contentInsetStartWithNavigationdas standardmäßig 16 dp beträgt. Ändern Sie dies, wenn Sie auch ein Navigationssymbol haben.

Es stellte sich heraus, dass dies Teil einer neuen Materialdesignspezifikation ist, die in Version 24 der Designbibliothek eingeführt wurde.

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

Es ist jedoch möglich, den zusätzlichen Speicherplatz zu entfernen, indem Sie dem Symbolleisten-Widget die folgende Eigenschaft hinzufügen.

app:contentInsetStartWithNavigation="0dp"

Vor : Geben Sie hier die Bildbeschreibung ein

Nach dem : Geben Sie hier die Bildbeschreibung ein

Naveen Kumar M.
quelle
Diese Lösung hat bei mir mit Android Jetpack (androidx) funktioniert
Francisc0
27

Ich habe eine andere Auflösung (Referenz appcompat-v7) gefunden, die den toolbarStyle wie folgt ändert:

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


<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>
madhu527
quelle
Bitte werfen Sie einen Blick auf diese stackoverflow.com/questions/31359608/… , wenn Sie mir helfen könnten.
Prashant Kedia
Ich werde überprüfen und Sie 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">

Das sollte gut genug sein.

Prakash
quelle
11

Ändern Sie einfach Ihre styles.xml

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

Anstatt dem Layout eine Symbolleiste hinzuzufügen, können Sie Ihre benutzerdefinierte Ansicht wie unten gezeigt festlegen.

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

Nur app:contentInsetStart="0dp"zur Symbolleiste hinzufügen , entfernen Sie den verbleibenden Platz.

Ihre Symbolleistendefinition sieht also so aus

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

und es sieht so aus

Geben Sie hier die Bildbeschreibung ein

Keyur
quelle
4

Mit können AppCompatAcitivtySie nur von verwenden

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);
toter Fisch
quelle
3

Sie müssen diese Zeile app2: contentInsetStart = "0dp" in Ihre Symbolleiste einfügen

<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
quelle
2
Für mich war es app:contentInsetStart="0dp"
Adil Soomro
1

Ich habe nirgendwo eine Lösung für mein Problem gefunden (erstes Bild), aber nach ein paar Stunden Graben habe ich endlich die einfachste Lösung gefunden. Bitte beachten Sie, dass ich es mit vielen XML-Attributen wie versucht habeapp:setInsetLeft="0dp" usw. , aber keines davon hat in diesem Fall geholfen.

Bild 1 Geben Sie hier die Bildbeschreibung ein

Der folgende Code löste dieses Problem wie in Abbildung 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);
}

Bild 2

Geben Sie hier die Bildbeschreibung ein

mifthi
quelle
1

Das Setzen der Attribute "contentInset ..." auf 0 in der Symbolleiste hat bei mir nicht funktioniert. Nilesh Sentas Lösung zur Aktualisierung des Stils hat funktioniert!

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);
Poseidon
quelle
0

Erstellen Sie eine Symbolleiste wie folgt:

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

Bitte folgen Sie diesem Link für mehr - Android-Tipps

Aneh Thakur
quelle
0

nur android:padding="0dp"Arbeit für mich hinzufügen

<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">
Sieger
quelle
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);

quelle
0

Sie können einfach das relative Layout innerhalb der Ansichtsgruppe der Symbolleiste in Ihrer XML-Datei verwenden und die Positionen der Widgets nach Bedarf für Ihren Anwendungsfall anpassen. Sie müssen kein benutzerdefiniertes Layout erstellen und es aufblasen und an die Symbolleiste anhängen. Sobald Sie in Ihrem Java-Code fertig sind, verwenden Sie setContentInsetsAbsolute (0,0) mit Ihrem Symbolleistenobjekt, bevor Sie es als Unterstützungsaktionsleiste in Ihrem Layout festlegen.

Soumyadeb Chattopadhyay
quelle
0

Es ist besser, ein Hintergrundelement in den Stil der App-Aktionsleiste einzufügen, das mit der Hintergrundfarbe der benutzerdefinierten Aktionsleiste übereinstimmt:

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

Nach Android 6.0 hat die Aktionsleiste sogar einen Rand rechts und kann nicht festgelegt werden. Fügen Sie einen rechten Rand hinzu, der die Aktivität wie folgt anpasst: (Die Ansicht ist die benutzerdefinierte Aktionsleiste oder eine rechte Schaltfläche darin.)

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

Die Actionbar machenism wird erst nach der Android 3.0+ App unterstützt. Wenn wir stattdessen eine Symbolleiste (von support lib v7) verwenden, sollten wir sie in jeder XML-Datei jeder Aktivität anordnen und das Problem der Überlappung mit der Systemstatusleiste in Android 5.0 oder höher beheben.

Shrdi
quelle
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
quelle
0

diese Arbeit für mich

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

Wenn Sie die Dokumentation der Symbolleiste überprüfen, ist standardmäßig der Stil definiert und es gibt ein Element contentInsetStart.

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

Wenn Sie diese Auffüllung überschreiben möchten, können Sie dies auf zwei Arten tun.

1. Überschreiben Sie den Stil und fügen Sie Ihren eigenen Stil mit den Werten contentInsetStart und contentInsetEnd hinzu

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

2. In XML können Sie die Werte contentInsetStart und contentInsetEnd direkt definieren

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

Unterstützt Ihre App Android 5? Wenn dies nicht der Fall ist, können Sie die Version der Support-Aktionsleiste v7 herabstufen. Es sieht aus wie:

Kompilieren Sie 'com.android.support:appcompat-v7:19.0.+' (Verwenden Sie nicht v7: 21+)

Machen Sie auch die Zielversion der Anwendung kleiner als 21.

targetSdkVersion 14

Wenn Ihre App Android 5 unterstützt -> benötigen Sie eine benutzerdefinierte ToolBar. (Weil appcombat-v7: 21 einige Änderungen hat).

quangson91
quelle