Я использую новый элемент FloatingActionButton из библиотеки дизайна Google, и у меня возникают странные проблемы с заполнением / полем. Это изображение (с включенными параметрами макета разработчика) взято из API 22.
И из API 17.
Это XML
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_gravity="bottom|right"
android:layout_marginLeft="16dp"
android:layout_marginRight="20dp"
android:layout_marginTop="-32dp"
android:src="@drawable/ic_action_add"
app:fabSize="normal"
app:elevation="4dp"
app:borderWidth="0dp"
android:layout_below="@+id/header"/>
Почему FAB в API 17 намного больше заполнения / поля?
CoordinatorLayout
чтобы выровнять его по вертикали и обратить внимание на дополнительную набивку перед леденцом. Вы можете понять это из декомпилированных источников FAB, но я бы предпочел дождаться, пока Google исправит это, как они это сделали дляCardView
.Ответы:
Обновление (октябрь 2016 г.):
Теперь правильное решение - поместить
app:useCompatPadding="true"
в ваш FloatingActionButton. Это сделает заполнение согласованным между разными версиями API. Тем не менее, это все еще немного снижает поля по умолчанию, поэтому вам может потребоваться их настроить. Но, по крайней мере, больше нет необходимости в стилях, специфичных для API.Предыдущий ответ:
Вы можете легко добиться этого, используя стили, специфичные для API. В обычном режиме
values/styles.xml
поставьте что-то вроде этого:а затем в values-v21 / styles.xml используйте это:
и примените стиль к вашему FloatingActionButton:
Как отмечали другие, в API <20 кнопка отображает свою собственную тень, которая увеличивает общую логическую ширину представления, тогда как в API> = 20 она использует новые параметры высоты, которые не влияют на ширину представления.
источник
elevation
вы установили на FAB.app:useCompatPadding="true"
Нет больше возиться с
styles.xml
или с.java
файлами. Позвольте мне сделать это проще.Дополнительные поля / отступы, которые вы видели на FAB на втором изображении, связаны с этим compatPadding на устройствах pre-lollipop . Если это свойство не установлено, оно применяется к устройствам pre-lollopop, а НЕ к устройствам lollipop +.
Доказательство концепции
источник
После нескольких поисков и тестирования решения я исправил свою проблему, добавив эту строку только в мой макет xml:
и это весь мой макет плавающих кнопок
источник
useCompatPadding
ни другое не дает такого результата.Возникла проблема в библиотеке поддержки дизайна. Используйте метод ниже, чтобы исправить эту проблему, пока библиотека не будет обновлена. Попробуйте добавить этот код в свою операцию или фрагмент, чтобы решить проблему. Сохраните свой xml таким же. На леденцах и выше нет поля, но ниже есть запас 16dp.
Обновить рабочий пример
XML - FAB находится в RelativeLayout
Ява
Преобразовать dp в px
леденец
Pre Lollipop
источник
RelativeLayout.LayoutParams
не может быть преобразован вLayoutParams
of,FloatingActionButton
и я не вижу полей в 16dp на pre Lollipop. ШиринаFloatingActionButton
pre Lollipop составляет 84dp вместо 56dp, а высота - 98dp.View.getLayoutParams
возвращаетLayoutParams
тип, в которомView
находится - в случае Евгения это aRelativeLayout.LayoutParams
.Предварительно Lollipop
FloatingActionButton
отвечает за рисование собственной тени. Следовательно, вид должен быть немного больше, чтобы оставалось место для тени. Чтобы добиться единообразного поведения, вы можете установить поля с учетом разницы в высоте и ширине. В настоящее время я использую следующий класс :Обновление: библиотеки поддержки Android v23 переименовали fab_size sizes в:
источник
Ответ Маркуса сработал для меня после обновления до версии 23.1.0 и внесения некоторых корректировок в импорт (с недавним плагином gradle мы используем наше приложение R вместо R библиотеки дизайна). Вот код для v23.1.0:
источник
В файле макета задайте для атрибута отметку 0 значение, так как для него требуется высота по умолчанию.
Теперь в процессе работы проверьте уровень API выше 21 и при необходимости установите высоту.
источник