web-dev-qa-db-ger.com

Android: Entfernen Sie den linken Rand des benutzerdefinierten Layouts von actionbar

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

enter image description here

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 einen kürzlich veröffentlichten Beitrag gefunden, der darauf hinweist, dass ein Problem mit der neuesten Version vorliegt. Ich habe auch ADT und SDK auf Android 5 aktualisiert.

Benutzerdefinierte Ansicht von Android ActionBar füllt nicht das übergeordnete Element

Ich weiß nicht was ich tun soll.

Bearbeiten (Teillösung):

Funktioniert nicht auf Android <= API 10.

Android Lollipop, AppCompat ActionBar benutzerdefinierte Ansicht nimmt nicht die gesamte Bildschirmbreite in Anspruch

Was habe ich geändert:

Verwenden Sie die neueste Sdk-Version:

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

Fügen Sie eine toolbarStyle hinzu:

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

Wenn Sie die Toolbar über XML hinzufügen, können Sie einfach XML-Attribute hinzufügen, um Inhaltseinsätze 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" />
493
LukeWaggoner

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;

189
cocotyty

Die linke Einfügung wird durch contentInsetStart der Symbolleiste verursacht, die standardmäßig 16dp ist.

Ändern Sie dies, um sich an der Keylinie auszurichten.

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

Zum Abgleichen der Material Design-Spezifikation gibt es ein zusätzliches Attribut contentInsetStartWithNavigation, das standardmäßig 16dp ist. Ändern Sie dies, wenn Sie auch ein Navigationssymbol haben.

Es stellte sich heraus, dass dies Teil einer neuen Material-Design-Spezifikation ist, die in Version 24 der Design-Bibliothek eingeführt wurde.

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

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

app:contentInsetStartWithNavigation="0dp"

Vor : enter image description here

Nach dem : enter image description here

33
Naveen Kumar M

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

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


<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>
23
madhu sudhan
<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.

13
Prakash

Ä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>
8
Nilesh Senta

Anstatt eine Symbolleiste im Layout hinzuzufügen, können Sie Ihre benutzerdefinierte Ansicht wie folgt einstellen.

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

Fügen Sie der Symbolleiste nur app:contentInsetStart="0dp" hinzu, um den verbleibenden Platz zu entfernen.

Ihre Toolbar-Definition 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

 enter image description here

6
Keyur Lakhani

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

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

Mit AppCompatAcitivty können Sie nur von 

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
deadfish

Ich habe nirgendwo eine Lösung für mein Problem (erstes Bild) gefunden, aber am Ende habe ich nach ein paar Stunden Graben eine einfachste Lösung. Bitte beachten Sie, dass ich viele xml-Attribute wie app:setInsetLeft="0dp" usw. ausprobiert habe, aber in diesem Fall hat keiner von ihnen geholfen.

Bild 1  enter image description here

der folgende Code hat dieses Problem wie in Abbildung 2 gelöst

@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

 enter image description here

1
mifthi

Das Setzen von "contentInset ..." -Attributen in der Symbolleiste auf 0 hat für mich nicht funktioniert. Nilesh Sentas Lösung zur Aktualisierung des Stils funktionierte!

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
Poseidon

Werkzeugleiste wie folgt erstellen:

<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

0
Aneh Thakur
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
user5415112

Es ist besser, ein Hintergrundelement in den Stil der App-Aktionsleiste aufzunehmen, um der Hintergrundfarbe der benutzerdefinierten Aktionsleiste zu entsprechen:

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

Nach Android 6.0 verfügt die Aktionsleiste sogar über ein Leerzeichen rechts und kann nicht festgelegt werden. Fügen Sie einen rechten Rand hinzu, der in der Aktivität wie folgt angepasst wird: aussicht ist die angepasste 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);

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

0
Shrdi

hinzufügen von Android:padding="0dp" Arbeit für mich

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

Die richtige und einfachste Antwort lautet auf einen anderen Beitrag:

Android Lollipop, AppCompat ActionBar-Ansicht nimmt nicht die gesamte Bildschirmbreite ein

Es ist als richtig markiert und nachdem ich es versucht habe, kann ich bestätigen, dass es funktioniert.

0
Ale Muzzi

Sie können das relative Layout innerhalb der Symbolleisten-Ansichtsgruppe einfach in Ihrer XML-Datei verwenden und die Positionen der Widgets nach Bedarf für Ihren Anwendungsfall anpassen. Wenn Sie dies in Ihrem Java-Code getan haben, verwenden Sie setContentInsetsAbsolute (0,0) mit Ihrem Symbolleistenobjekt, bevor Sie es als Unterstützungsaktionsleiste in Ihrem Layout festlegen.

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

diese Arbeit für mich

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