Jak usunąć wypełnienie wokół przycisków w Androidzie?

184

W mojej aplikacji na Androida mam następujący układ:

<?xml version="1.0" encoding="utf-8" ?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical">

    <fragment
         android:id="@+id/map"
         android:layout_width="match_parent"
         android:layout_height="0dp" 
         android:layout_weight="1" 
         class="com.google.android.gms.maps.SupportMapFragment"/>

    <Button
        android:id="@+id/button_back"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="CloseActivity"
        android:padding="0dp"
        android:text="@+string/back" />

</LinearLayout>

W podglądzie i na telefonie wygląda to tak:

Jak widać na przycisku w dolnym obszarze, jest tam trochę wypełnienia.

Jak mogę się tego pozbyć i pozwolić przyciskowi całkowicie wypełnić dolny obszar?

omega
źródło
6
Odpowiedź DATerre jest poprawna przez dwa lata. Czy możesz to tak oznaczyć?
JohnnyLambada,
1
To pytanie wymaga edycji, aby mieć lepszy tytuł. Stał się pierwszym wynikiem w wyszukiwarce Google, który tak naprawdę nie odpowiada na pytanie.
SOFe,

Odpowiedzi:

435

Dla mnie problemem okazały się minHeight i minWidth w niektórych motywach Androida.

W elemencie Button dodaj:

<Button android:minHeight="0dp" android:minWidth="0dp" ...

Lub w stylu twojego przycisku:

<item name="android:minHeight">0dp</item>
<item name="android:minWidth">0dp</item>
DA Terre
źródło
5
Minęło trochę czasu, zanim zdałem sobie sprawę, że nie mam do czynienia z jakimś dziwnym zachowaniem padding, ale raczej minHeight.
Pijusn
7
Nie sądzę, że ta odpowiedź w ogóle odpowiada na pierwotne pytanie. Ale nadal cieszę się, że się z tym spotkałem, ponieważ nie mogłem zrozumieć, dlaczego Buttonwciąż zajmowałem tyle miejsca, nawet po jego ustawieniu android:background="@null". Fakt, że Buttondomyślny styl jest odpowiedzialny, jest bardzo dobrą wskazówką.
Tony Chan,
Ważne jest, aby używać zarówno Androida: minHeight = "0dp" android: minWidth = "0dp", a nie tylko jednego z nich.
Ricardo
To usuwa zaokrąglony narożnik i efekt tętnienia przycisku na Androidzie Nougat. Masz pojęcie, co może być przyczyną takiego zachowania?
rraallvv
Ta odpowiedź rozwiązała problem z GridLayout zawierającym przyciski z opcjami autoSize na szalonym tekście, gdy próbowałem uzyskać więcej przycisków, aby zmieściły się w wierszach / kolumnach. Prosta odpowiedź, której znalezienie zajęło mi dużo czasu ...
Mike Hanafey
71

Moje rozwiązanie zostało ustawione na 0 właściwości insetTop i insetBottom.

<android.support.design.button.MaterialButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:insetTop="0dp"
        android:insetBottom="0dp"
        android:text="@string/view_video"
        android:textColor="@color/white"/>
Sochas
źródło
1
To właśnie rozwiązało problem dla mnie! Dzięki!
SPM
46

To nie jest padding, to cień wokół przycisku w tle do rysowania. Utwórz własne tło, a zniknie.

Delyan
źródło
6
Zrobiłem. nie zniknął.
hasan
Jak można zmierzyć jego rozmiar?
Iman Akbari
To jest to, @Behr, zmieniając tło na kolor przycisku
Ramon
Właśnie zdałem sobie sprawę, że mój obraz tła ma przezroczyste wypełnienie
Fruit
22

Obejściem może być próba użycia -vewartości marginesów, takich jak:

<Button
    android:id="@+id/button_back"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="CloseActivity"
    android:padding="0dp"
    android:layout_marginLeft="-5dip"
    android:layout_marginRight="-5dip"
    android:layout_marginTop="-5dip"
    android:layout_marginBottom="-5dip"
    android:text="@string/back" />

Sprawi, że ta przestrzeń zniknie. Mam na myśli, że możesz wybrać odpowiednią dipwartość, która sprawi, że zniknie. To zadziałało dla mnie. Mam nadzieję, że Ci się uda.

Shobhit Puri
źródło
4
Byłbym ostrożny przy użyciu tego rozwiązania. Po prostu ukrywa tło przycisku (ramka + cienie) za pomocą marginesów ujemnych. Co to są zmiany stylu, a border + shadow zajmuje więcej niż 5dp? Wolę używać rozwiązania Delyan / Casey Murray, aby być bezpiecznym.
lenrok258
Ponadto ujemne marże nie są oficjalnie obsługiwane w Androidzie, więc ja też bym tego unikał
Tim Kist
14

Aby usunąć wypełnienie wokół przycisku przełączania, musimy ustawić minWidth i minHeight 0dp.android:minWidth="0dp" android:minHeight="0dp"

  <ToggleButton
        android:id="@+id/toggle_row_notifications"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="0dp"
        android:minHeight="0dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:padding="@dimen/_5sdp"
        android:textOn=""
        android:textOff=""
        android:background="@android:color/transparent"
        android:button="@drawable/toggle_selector"
        />

ustaw plik rysunkowy na atrybut przycisku, taki jak: android:button="@drawable/toggle_selector"

Poniżej znajduje się mój toggle_selecter.xmlplik

<?xml version="1.0" encoding="utf-8"?>
     <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:drawable="@drawable/notifications_toggle_on" 
                  android:state_checked="true"/>
            <item android:drawable="@drawable/notifications_toggle_off" 
                  android:state_checked="false"/>
     </selector>
Yashoda Bane
źródło
9

Jestem nowy na Androida, ale miałem podobną sytuację. Zrobiłem to, co sugerował @Delyan, a także użyłem Androida: background = "@ null" w pliku układu xml.

Casey Murray
źródło
6

W zestawie XML przycisku android:includeFontPadding="false"

użytkownik1005462
źródło
6

Miałem ten sam problem i wydaje się, że dzieje się tak z powodu koloru tła przycisku. Spróbuj zmienić kolor tła na inny, np .:

android:background="@color/colorActive"

i zobacz, czy to działa. Następnie możesz zdefiniować styl, jeśli chcesz użyć przycisku.

Panagiotis
źródło
Usuwa to funkcję podświetlania / animacji przycisku.
Altus,
5

Aby usunąć górne i dolne wypełnienie

<com.google.android.material.button.MaterialButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="0dp"//to effect the following parameters, this must be added!
        android:insetTop="0dp"
        android:insetBottom="0dp"/>

Aby usunąć lewą i prawą wyściółkę

<com.google.android.material.button.MaterialButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="0dp"//to effect the following parameters, this must be added!
        android:insetLeft="0dp"
        android:insetRight="0dp"/>
Ali Rezaiyan
źródło
4

To nie jest padding, ale cień tła do rysowania lub problem z minHeighti minWidth.

Jeśli nadal chcesz uzyskać efekt miłego tętnienia, możesz stworzyć własny styl przycisków, używając ?attr/selectableItemBackground:

<style name="Widget.AppTheme.MyCustomButton" parent="Widget.AppCompat.Button.Borderless">
    <item name="android:minHeight">0dp</item>
    <item name="android:minWidth">0dp</item>
    <item name="android:layout_height">48dp</item>
    <item name="android:background">?attr/selectableItemBackground</item>
</style>

I zastosuj go do przycisku:

<Button 
    style="@style/Widget.AppTheme.MyCustomButton"
    ... />
Allan Veloso
źródło
2

Wydaje się, że nie jest wypełnieniem, marginesem ani minimalną wysokością / szerokością. Ustawienie android:background="@null"przycisku traci animację dotykową, ale okazuje się, że ustawienie tła na cokolwiek naprawia granicę.


Obecnie współpracuję z:

minSdkVersion 19
targetSdkVersion 23
juil
źródło
1

Nadaj swojemu przyciskowi niestandardowe tło: @ drawable / material_btn_blue

Mike6679
źródło
0

Możesz to również zrobić za pomocą layout_width(height) parametrów.

Np. Usunąłem górną i dolną spację za pomocą android:layout_height="18dp"kodu.

Max Zonov
źródło
0

Standardowy przycisk nie powinien być używany na pełnej szerokości dlatego tak się dzieje.

tło

Jeśli spojrzysz na materiał projektowy - styl przycisku , zobaczysz, że przycisk ma obszar kliknięcia o wysokości 48dp, ale z jakiegoś powodu zostanie wyświetlony jako 36dp wysokości.

Jest to zarys tła, który widzisz, który nie obejmie całego obszaru samego przycisku.
Ma zaokrąglone rogi i wyściółkę i powinien być klikalny, zawijać zawartość i nie obejmować całej szerokości u dołu ekranu.

Rozwiązanie

Jak wspomniano powyżej, to, czego chcesz, to inne tło . Nie standardowy przycisk, ale tło do wyboru przedmiotu z tym ładnym efektem falowania.

W tym przypadku użycia istnieje ?selectableItemBackgroundatrybut motywu, którego można użyć do tła (szczególnie na listach).
Dodanie standardowego tętnienia na platformie (lub listy stanów kolorów na <21) i użycie bieżących kolorów motywu.

Na przykład możesz użyć:

<Button
    android:id="@+id/sign_in_button"
    style="?android:attr/buttonBarButtonStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Login"
    android:background="?attr/selectableItemBackground" />
                   <!--  /\ that's all -->

Nie ma również potrzeby dodawania wag układu, jeśli widok jest jedyny i obejmuje cały ekran

Jeśli masz inne wyobrażenie o tym, jak powinno wyglądać twoje tło, musisz samodzielnie stworzyć niestandardową grafikę i zarządzać kolorem i stanem.

Ta odpowiedź została skopiowana z pytania: Jak prawidłowo usunąć wypełnienie (lub margines?) Wokół przycisków w Androidzie?

Mohammad7G
źródło
0

Po kilku godzinach kopania wokół wielu odpowiedzi końcu znaleźć rozwiązanie, które nie wykorzystuje się inny element, obróbki minHeightlub minWidth, nawet owijania Buttonwokół RelativeLayout.

<Button
    android:foreground="?attr/selectableItemBackground"
    android:background="@color/whatever" />

Głównym na wynos jest ustawienie pierwszego planu zamiast tła, o którym mówi wiele odpowiedzi. Zmiana samego tła naselectableItemBackground spowoduje po prostu zastąpienie wszelkich zmian dokonanych w kolorze / tle przycisku, jeśli takie istnieją.

Zmiana pierwszego planu daje to, co najlepsze z obu światów: pozbądź się „niewidocznego” wypełnienia i zachowaj wygląd przycisku.

Altus
źródło
0

Możesz użyć stylu Bez obramowania w AppCompatButton, jak poniżej. i użyj Androida: tło z nim.

style = "@ style / Widget.AppCompat.Button.Borderless.Colored"

Kod przycisku

<androidx.appcompat.widget.AppCompatButton
        android:id="@+id/button_visa_next"
        android:background="@color/colorPrimary"
        style="@style/Widget.AppCompat.Button.Borderless.Colored"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/spacing_normal"
        android:text="@string/next"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

Wynik:

wprowadź opis zdjęcia tutaj

Shihab Uddin
źródło