Android: usuń lewy margines z niestandardowego układu paska akcji


269

Używam niestandardowego widoku paska akcji i jak widać na zrzucie ekranu poniżej, na pasku akcji jest pusta szara przestrzeń. Chcę to usunąć.

wprowadź opis zdjęcia tutaj

Co ja zrobiłem:

res / wartości-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 / wartości / 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>

Oczywisty

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

Główna aktywność

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

Znalazłem ostatni post, który wskazuje, że jest problem z najnowszą wersją. Zaktualizowałem także ADT i SDK do Androida 5.

Niestandardowy widok Androida ActionBar nie wypełnia elementu nadrzędnego

Nie wiem co powinienem zrobić.

Edycja (rozwiązanie częściowe):

Nie działa na Androidzie <= API 10.

Android Lollipop, niestandardowy widok AppCompat ActionBar nie zajmuje całej szerokości ekranu

Co zmieniłem:

Użyj najnowszej wersji SDK:

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

Dodaj 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
widziałem ten post
Kaushik,

1
@Zbarcea To nie działa na moim końcu. a dla Androida: skargi ToolbarStyle IDE dotyczące wymaganego poziomu interfejsu API 21 min to 11. Czy to rozwiązanie działa u Ciebie?
Programista

Odpowiedzi:


609

Jeśli dodajesz za Toolbarpośrednictwem XML, możesz po prostu dodać atrybuty XML, aby usunąć wstawki zawartości.

<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 " dla każdego, kto brakuje części „app” xml.
Prakash

3
Jaka jest różnica między używaniem „app:” a „android:” ..?
Micro

3
Są to różne przestrzenie nazw. przestrzeń nazw „android” jest tradycyjnie używana dla wszystkich atrybutów zdefiniowanych przez system operacyjny Android. Przestrzeń nazw „aplikacja” jest tradycyjnie używana dla atrybutów zdefiniowanych przez twoją aplikację, albo poprzez import bibliotek, albo dodanie własnych w pliku attrs.xml. Należy pamiętać, że „uchwyt” przestrzeni nazw może być tym, czym ma być, jest definiowany za pomocą atrybutu xmlns w układzie głównym lub, w tym przypadku, w samym elemencie układu. Możesz zrobić to „xmlns: nougat”, jeśli chcesz. tzn. w wiązaniu danych Androida zazwyczaj używam „bind” dla bindAdapters.
LukeWaggoner,

@idratherbeintheair Mam widok wyszukiwania na pasku narzędzi, ale kiedy go ukrywam za pomocą widoczności, obramowanie oznacza granicę widoku wyszukiwania, co oznacza, że ​​rodzaj paska nadal wyświetla się na pasku narzędzi. jakiś pomysł na ten temat?
Jay Rathod RJ

24
w moim przypadku wystarczy dodać ten atrybut do projektu xml android.support.v7.widget.Toolbar: app:contentInsetStartWithNavigation="0dp"
computingfreak

198

Spróbuj tego:

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

Użyłem tego kodu w moim projekcie, powodzenia;


4
Doskonały! parent.setContentInsetsAbsolute (0,0) załatwia sprawę!
Bam

7
To działa. Może jednak nieco zmienić układ. Alternatywnie możesz to zrobić actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0);zamiast pompować układ.
Markymark

Nie działa dla mnie, chociaż mój problem jest tylko nieco inny.
Solace

Funkcja setContentInsetsAbsolute jest obsługiwana tylko wtedy, gdy SDK> 21. Każde rozwiązanie
Pramod J George,

11
musiał również dodać parent.setPadding(0, 0, 0, 0);do tabletów
Alexandre G

47

Lewa wstawka jest spowodowana przez pasek narzędzi Toolbar, contentInsetStartktóry domyślnie ma 16dp.

Zmień to, aby wyrównać do linii horyzontu.

Aktualizacja dla biblioteki wsparcia v24.0.0:

Aby dopasować specyfikację Material Design, istnieje dodatkowy atrybut, contentInsetStartWithNavigationktóry domyślnie wynosi 16dp. Zmień to, jeśli masz także ikonę nawigacji.

Okazało się, że jest to część nowej specyfikacji projektowania materiałów wprowadzonej w wersji 24 biblioteki Design.

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

Można jednak usunąć dodatkową przestrzeń, dodając następującą właściwość do widżetu paska narzędzi Toolbar.

app:contentInsetStartWithNavigation="0dp"

Przed : wprowadź opis zdjęcia tutaj

Po : wprowadź opis zdjęcia tutaj


to rozwiązanie działało dla mnie przy użyciu Androida Jetpack (Androidx)
Francisc0,

27

Znalazłem inną rozdzielczość (referencja appcompat-v7), która zmienia pasek narzędzi Toolbar, następujący kod:

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


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

Proszę spojrzeć na ten stackoverflow.com/questions/31359608/... , jeśli mógłbyś mi pomóc.
Prashant Kedia,

sprawdzę i pozwolę ci się
przekonać

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

To powinno wystarczyć.


11

Po prostu zmodyfikuj plik styles.xml

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

8

Zamiast dodawać pasek narzędzi w układzie, możesz ustawić własny widok, jak pokazano poniżej.

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

7

Tylko dodaj app:contentInsetStart="0dp"do paska narzędzi, aby usunąć to wolne miejsce.

Twoja definicja paska narzędzi wygląda tak

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

i tak to wygląda

wprowadź opis zdjęcia tutaj


4

Używając AppCompatAcitivtymożesz użyć tylko przez

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

Musisz dodać ten wiersz app2: contentInsetStart = "0dp" na pasku narzędzi

<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
Dla mnie to był app:contentInsetStart="0dp"
Adil Soomro

1

Nigdzie nie znalazłem rozwiązania dla mojego problemu (pierwsze zdjęcie), ale w końcu po kilku godzinach kopania ostatecznie znalazłem najprostsze rozwiązanie. Pamiętaj, że próbowałem z wieloma atrybutami XML, takimi jak app:setInsetLeft="0dp"itp., Ale żaden z nich nie pomógł w tym przypadku.

Obrazek 1 wprowadź opis zdjęcia tutaj

poniższy kod rozwiązał ten problem, jak na zdjęciu 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);
}

Zdjęcie 2

wprowadź opis zdjęcia tutaj


1

Ustawienie atrybutów „contentInset ...” na 0 na pasku narzędzi nie działało dla mnie. Udało się rozwiązanie Nilesha Senty do aktualizacji stylu!

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

Utwórz pasek narzędzi w ten sposób:

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

kliknij ten link, aby uzyskać więcej - Wskazówki dotyczące Androida


0

tylko dodawanie android:padding="0dp"pracy dla mnie

<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

Możesz po prostu użyć układu względnego w grupie widoków paska narzędzi w pliku xml i dopasować pozycje widżetów, tak jak potrzebujesz w przypadku użycia. Nie musisz tworzyć niestandardowego układu i nadmuchać go i dołączyć do paska narzędzi. Po zakończeniu w kodzie java użyj setContentInsetsAbsolute (0,0) z obiektem paska narzędzi przed ustawieniem go jako paska akcji wsparcia w twoim układzie.


0

Lepiej byłoby dodać element tła do stylu paska akcji aplikacji, aby był zgodny z kolorem tła dostosowanego paska akcji:

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

Po Androidzie 6.0 pasek akcji ma nawet margines po prawej stronie i nie można go ustawić. Dodaj prawy margines dostosowując działanie w następujący sposób: ( widok to dostosowany pasek akcji lub prawy przycisk w nim)

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

Machenizm paska działań jest obsługiwany po aplikacji na Androida 3.0+. Jeśli zamiast tego użyjemy paska narzędzi (wsparcia lib v7), powinniśmy go ułożyć w każdym pliku xml każdej aktywności i zająć się problemem nakładania się paska stanu systemu na urządzeniu z Androidem 5.0 lub nowszym.


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

ta praca dla mnie

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

0

Jeśli sprawdzisz dokumentację paska narzędzi, domyślnie ma on zdefiniowany styl i istnieje element contentInsetStart.

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

Jeśli chcesz zastąpić to wypełnienie, możesz to zrobić na dwa sposoby.

1. Zastąp styl i dodaj własny styl z wartościami contentInsetStart i contentInsetEnd

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

2. W XML można bezpośrednio zdefiniować wartości contentInsetStart i 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

Czy Twoja aplikacja obsługuje Androida 5? Jeśli nie obsługuje, możesz obniżyć wersję paska pomocy wsparcia v7. To wygląda jak:

kompiluj „com.android.support:appcompat-v7:19.0.+” (Nie używaj wersji 7: 21+)

także spraw, aby docelowa wersja aplikacji była mniejsza niż 21.

targetSdkVersion 14

Jeśli Twoja aplikacja obsługuje system Android 5 ->, potrzebujesz niestandardowego paska narzędzi. (Becuase appcombat-v7: 21 ma pewne zmiany).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.