Làm cách nào để loại bỏ phần đệm xung quanh các nút trong Android?


184

Trong ứng dụng Android của tôi, tôi có bố cục này:

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

Trong bản xem trước và trên điện thoại, có vẻ như:

Như bạn có thể thấy trên nút ở khu vực phía dưới, có một số phần đệm ở đó.

Làm thế nào tôi có thể thoát khỏi điều đó, và để nút lấp đầy khu vực phía dưới?


6
Câu trả lời của DATerre đã đúng trong hai năm. Bạn có thể đánh dấu nó như vậy?
JohnnyLambada

1
Câu hỏi này yêu cầu chỉnh sửa để có một tiêu đề tốt hơn. Nó đã trở thành kết quả đầu tiên trong Tìm kiếm của Google mà nó không thực sự trả lời câu hỏi.
SOFe

Câu trả lời:


435

Đối với tôi, vấn đề hóa ra là minHeight và minWidth trên một số chủ đề Android.

Trên phần tử Nút, thêm:

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

Hoặc theo kiểu nút của bạn:

<item name="android:minHeight">0dp</item>
<item name="android:minWidth">0dp</item>

5
Mất một lúc cho đến khi tôi nhận ra tôi không phải đối phó với một số hành vi đệm kỳ lạ mà là tối thiểu.
Pijusn

7
Tôi không nghĩ câu trả lời này thực sự trả lời câu hỏi ban đầu. Nhưng tôi vẫn vui vì tôi đã xem qua nó bởi vì tôi không thể hiểu tại sao tôi Buttonvẫn chiếm quá nhiều không gian ngay cả sau khi đặt nó android:background="@null". Thực tế là Buttonphong cách mặc định chịu trách nhiệm là một mẹo rất tốt.
Tony Chan

Điều quan trọng là sử dụng cả android: minHeight = "0dp" android: minWidth = "0dp", và không chỉ một trong số họ.
Ricardo

Điều này loại bỏ góc tròn và hiệu ứng gợn từ nút trên Android Nougat, bạn có biết điều gì có thể gây ra hành vi này không?
rraallvv

Câu trả lời này đã giải quyết vấn đề với GridLayout chứa các nút có tùy chọn tự động Kích thước trên văn bản sẽ bị rối khi tôi cố gắng lấy thêm các nút để khớp với các hàng / cột. Câu trả lời đơn giản khiến tôi mất nhiều thời gian để tìm ...
Mike Hanafey

71

Giải pháp của tôi đã được đặt thành 0 thuộc tính insetTop và 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"/>

1
Đây là những gì giải quyết vấn đề cho tôi là tốt! Cảm ơn!
SPM

46

Đó không phải là đệm, đó là bóng xung quanh nút trong nền có thể vẽ được. Tạo nền của riêng bạn và nó sẽ biến mất.


6
Tôi đã làm. đã không biến mất.
hasan

Làm thế nào có thể đo kích thước của nó?
Iman Akbari

Đây là nó, @Behr, thay đổi nền thành màu của nút
Ramon

Tôi mới nhận ra hình nền của mình có lớp đệm trong suốt
Fruit

22

Một cách giải quyết có thể là cố gắng sử dụng -vecác giá trị cho lề như sau:

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

Nó sẽ làm cho không gian đó tan biến. Ý tôi là bạn có thể chọn dipgiá trị phù hợp , làm cho nó biến mất. Nó làm việc cho tôi. Hi vọng nó sẽ giúp ích cho bạn.


4
Tôi sẽ cẩn thận khi sử dụng giải pháp này. Những gì nó làm chỉ là ẩn nền nút (viền + bóng) bằng cách sử dụng lề âm. Thay đổi kiểu dáng là gì và đường viền + bóng mất hơn 5dp? Tôi thà sử dụng giải pháp Delyan / Casey Murray để an toàn.
lenrok258

Ngoài ra, tỷ lệ lợi nhuận âm không được hỗ trợ chính thức trong Android nên tôi cũng sẽ tránh điều này
Tim Kist

14

Để loại bỏ phần đệm xung quanh nút chuyển đổi, chúng ta cần đặt minWidth và 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"
        />

đặt tập tin có thể vẽ của bạn thành thuộc tính nút như: android:button="@drawable/toggle_selector"

Dưới đây là toggle_selecter.xmltập tin của tôi

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

9

Tôi mới dùng Android nhưng tôi cũng gặp trường hợp tương tự. Tôi đã làm những gì @Delyan đề xuất và cũng đã sử dụng android: background = "@ null" trong tệp bố cục xml.



6

Tôi đã có cùng một vấn đề và có vẻ như đó là do màu nền của nút. Hãy thử thay đổi màu nền sang màu khác, ví dụ:

android:background="@color/colorActive"

và xem nếu nó hoạt động. Sau đó, bạn có thể xác định kiểu nếu bạn muốn cho nút sử dụng.


Điều này loại bỏ khả năng làm nổi bật / hoạt hình của nút.
Altus

5

Để loại bỏ phần đệm trên cùng và dưới cùng

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

Để loại bỏ phần đệm bên trái và bên phải

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

4

Nó không phải là một phần đệm mà là bóng của nền có thể vẽ được hoặc là một vấn đề với minHeightminWidth.

Nếu bạn vẫn muốn gợn ảnh hưởng tốt, bạn có thể tạo kiểu nút riêng bằng cách sử dụng ?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>

Và áp dụng nó cho nút:

<Button 
    style="@style/Widget.AppTheme.MyCustomButton"
    ... />

2

Nó dường như không phải là phần đệm, lề hoặc minheight / width. Cài đặt android:background="@null"nút sẽ mất hình ảnh động cảm ứng, nhưng hóa ra việc đặt nền thành bất cứ thứ gì ở tất cả các bản sửa lỗi đó.


Tôi hiện đang làm việc với:

minSdkVersion 19
targetSdkVersion 23

1

Cung cấp cho nút của bạn một nền tùy chỉnh: @ drawable / liệu_btn_blue


0

Bạn cũng có thể làm điều đó với layout_width(height)các tham số.

Ví dụ, tôi đã xóa không gian trên và dưới với android:layout_height="18dp"mã.


0

Một nút tiêu chuẩn không được sử dụng ở toàn bộ chiều rộng , đó là lý do tại sao bạn trải nghiệm điều này.

Lý lịch

Nếu bạn nhìn vào Thiết kế Vật liệu - Kiểu Nút, bạn sẽ thấy rằng một nút có vùng nhấp chuột chiều cao 48dp, nhưng sẽ được hiển thị là 36dp chiều cao vì ... một số lý do.

Đây là phác thảo nền mà bạn nhìn thấy, nó sẽ không bao gồm toàn bộ khu vực của nút.
Nó có các góc tròn và một số phần đệm và được cho là có thể tự bấm, bao bọc nội dung của nó và không kéo dài toàn bộ chiều rộng ở dưới cùng màn hình của bạn.

Giải pháp

Như đã đề cập ở trên, những gì bạn muốn là một nền tảng khác nhau . Không phải là một nút tiêu chuẩn, mà là một nền tảng cho một mục có thể lựa chọn với hiệu ứng gợn đẹp này.

Đối với trường hợp sử dụng này, có ?selectableItemBackgroundthuộc tính chủ đề mà bạn có thể sử dụng cho nền của mình (đặc biệt là trong danh sách).
Nó sẽ thêm một gợn tiêu chuẩn nền tảng (hoặc một số danh sách trạng thái màu trên <21) và sẽ sử dụng màu chủ đề hiện tại của bạn.

Đối với usecase của bạn, bạn có thể chỉ cần sử dụng như sau:

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

Cũng không cần thêm trọng lượng bố cục nếu chế độ xem của bạn là duy nhất và kéo dài toàn bộ màn hình

Nếu bạn có một số ý tưởng khác nhau về những gì nền của bạn sẽ trông giống như bạn phải tự tạo một bản vẽ có thể tùy chỉnh, và quản lý màu sắc và trạng thái ở đó.

Câu trả lời này được sao chép từ Câu hỏi: Làm cách nào để xóa phần đệm (hoặc lề?) Xung quanh các nút trong Android?


0

Sau giờ đào bới xung quanh nhiều câu trả lời cuối cùng tôi đã tìm thấy một giải pháp mà không sử dụng một yếu tố khác nhau, thao tác minHeighthay minWidth, hoặc thậm chí quấn Buttonquanh một RelativeLayout.

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

Điểm nổi bật chính ở đây là cài đặt tiền cảnh thay vì nền như nhiều câu trả lời quy định. Thay đổi nền selectableItemBackgroundsẽ chỉ ghi đè lên bất kỳ thay đổi nào bạn đã thực hiện đối với màu / nền của nút, nếu có.

Thay đổi tiền cảnh mang đến cho bạn điều tốt nhất của cả hai thế giới: thoát khỏi phần đệm "vô hình" và giữ lại thiết kế nút của bạn.


0

Bạn có thể sử dụng kiểu Borderless trong AppCompatButton như bên dưới. và sử dụng android: nền với nó.

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

Mã nút

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

Đầu ra:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.