Як видалити набивання навколо кнопок в Android?


184

У моєму додатку для Android у мене такий макет:

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

У попередньому перегляді та на телефоні це виглядає так:

Як ви можете бачити на кнопці в нижній частині, там є деякі накладки.

Як я можу позбутися цього і дозволити кнопці повністю заповнити нижню область?


6
Відповідь DATerre була правильною протягом двох років. Чи можете ви позначити це так?
JohnnyLambada

1
Це питання потребує редагування, щоб мати кращу назву. Це стало першим результатом у пошуку Google, поки він не відповідає на це питання.
SOFe

Відповіді:


435

Для мене проблемою виявилися minHeight та minWidth на деяких темах Android.

На елементі кнопки додайте:

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

Або у стилі вашої кнопки:

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

5
Минув деякий час, поки я не зрозумів, що я не маю справу з якоюсь дивною поведінкою підкладки, а швидше з minHeight.
Підзюн

7
Я не думаю, що ця відповідь взагалі відповідає на початкове запитання. Але я все ще радий, що натрапив на це, бо не міг зрозуміти, чому мій Buttonвсе ще займає стільки місця навіть після встановлення його android:background="@null". Той факт, що Buttonстиль за замовчуванням відповідає, є дуже гарною підказкою.
Тоні Чан

Важливо використовувати і android: minHeight = "0dp" android: minWidth = "0dp", і не тільки один з них.
Рікардо

Це видаляє ефект закругленого кута та пульсації кнопкою на Android Nougat, будь-яка ідея, що може спричинити таку поведінку?
rraallvv

Ця відповідь вирішила проблему з GridLayout, що містить кнопки з параметрами автоматичного розміру в текстовому підході, оскільки я намагався отримати більше кнопок, щоб вони вміщувалися в рядки / стовпці. Проста відповідь, яка знадобила мені довгий час, щоб знайти ...
Майк Ханафей

71

Моє рішення було встановлено на 0 властивостей insetTop та 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
Ось це і вирішило проблему для мене! Дякую!
SPM

46

Це не підкладка, це тінь навколо кнопки на задньому плані. Створіть власний фон, і він зникне.


6
Я зробила. не зник.
Хасан

Як можна виміряти його розмір?
Іман Акбарі

Це воно, @Behr, змінивши фон на колір кнопки
Рамон

Я щойно зрозумів, що в моєму фоновому зображенні є прозорі набивки
Фрукти

22

Приблизним способом може бути намагання використовувати -veзначення для поля, наприклад:

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

Це змусить цей простір зникнути. Я маю на увазі, що ви можете вибрати відповідне dipзначення, яке змушує його піти. Це працювало для мене. Сподіваюся, це працює для вас.


4
Я був би обережний, використовуючи це рішення. Це лише просто приховування фону кнопок (рамка + тіні), використовуючи негативні поля. Що таке зміни стилю, а межі + тінь займає більше 5dp? Я вважаю за краще використовувати рішення Delyan / Casey Murray, щоб бути в безпеці.
lenrok258

Також негативні надбавки офіційно не підтримуються в Android, тож я теж цього не уникну
Тім Кіст

14

Для видалення накладки навколо кнопки перемикання нам потрібно встановити minWidth і 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"
        />

встановіть ваш файл, що виводиться, на атрибут кнопки типу: android:button="@drawable/toggle_selector"

Нижче мій toggle_selecter.xmlфайл

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

Я новачок в андроїді, але в мене була схожа ситуація. Я зробив те, що запропонував @Delyan, а також застосував android: background = "@ null" у файлі макета xml.



6

У мене була така ж проблема, і, здається, це через колір фону кнопки. Спробуйте змінити колір фону на інший колір, наприклад:

android:background="@color/colorActive"

і подивіться, чи працює він. Потім ви можете визначити стиль, якщо хочете використовувати кнопку.


Це знімає можливість підсвічування / анімації кнопки.
Альтус

5

Для видалення верхньої та нижньої підкладки

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

Для видалення лівої та правої накладки

<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

Це не прокладка, але або тінь фону, що малюється, або проблема з minHeightі minWidth.

Якщо ви все ще хочете, щоб приємний пульсатор впливав, ви можете створити свій власний стиль кнопки, використовуючи ?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>

І застосуйте його до кнопки:

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

2

Здається, це не прокладка, запас, а також міні-висота / ширина. Встановлення android:background="@null"кнопки втрачає сенсорну анімацію, але виявляється, що встановлення фону на що-небудь взагалі фіксує цю межу.


Зараз я працюю з:

minSdkVersion 19
targetSdkVersion 23


0

Ви також можете це зробити з layout_width(height)параметрами.

Наприклад, я видалив верхній і нижній пробіл з android:layout_height="18dp"кодом.


0

Стандартна кнопка не повинна використовуватися на повну ширину , тому ви відчуваєте це.

Фон

Якщо ви подивитесь на стиль дизайну матеріалу - кнопки, ви побачите, що кнопка має область клацання по висоті 48 дп, але відображатиметься як 36dp висоти з якоїсь причини.

Це контур фону, який ви бачите, який не буде охоплювати всю область самої кнопки.
Він має закруглені кути та деякі накладки, і їх можна було натискати самі по собі, загортати його вміст, а не на всю ширину внизу екрана.

Рішення

Як було сказано вище, те, що ви хочете, - це інше тло . Не стандартна кнопка, а фон для обраного елемента з цим приємним ефектом пульсацій.

Для цього випадку є ?selectableItemBackgroundатрибут теми, який ви можете використовувати для своїх фонів (особливо у списках).
Він додасть стандартну пульсацію платформи (або деякий список стану кольорів у <21) та використає ваші поточні кольори теми.

Для вашої скриньки ви можете просто використовувати наступне:

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

Також не потрібно додавати ваги макета, якщо ваш погляд єдиний і охоплює весь екран

Якщо у вас є якесь інше уявлення про те, як має виглядати ваш фон, ви повинні створити власну програму для малювання та керувати кольором та станом там.

Ця відповідь скопійована з питання: Як правильно видалити набивання (чи запас?) Навколо кнопок Android?


0

Після декількох годин копатися кілька відповідей я , нарешті , знайшов рішення , яке не використовує інший елемент, маніпулювати minHeightабо minWidth, або навіть обертати Buttonнавколо RelativeLayout.

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

Основним заходом тут є встановлення переднього плану замість фону, як передбачено багатьма відповідями. Зміна самого фону на selectableItemBackgroundпросто замінить усі зміни, внесені в колір / фон кнопки, якщо такі є.

Зміна переднього плану дає найкраще з обох світів: позбудьтеся від «невидимих» накладок і збережіть дизайн кнопки.


0

Ви можете використовувати стиль Borderless в AppCompatButton, як показано нижче. і використовувати android: фон з ним.

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

Код кнопки

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

Вихід:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.