Android Nougat имеет другой расчет dp? Размеры кнопок изменились после обновления

Мой Samsung Galaxy s7 только что обновился до Android Nougat 7.0, и я заметил, что некоторые кнопки отображаются по-другому. У меня есть еще один Galaxy s7, который еще не прошел обновление (Marshmallow 6.0.1). Я очень хорошо вижу разницу в размерах:

Зефирка:

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

Нуга:

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

Для layout_height этой кнопки SHARE жестко установлено значение 44dp. Используя Layout Inspector в Android Studio, я могу прочитать, что он разрешается до 176 пикселей для Marshmallow и 132 пикселей для Nougat (те же значения для mMeasuredHeight). Вы также можете видеть, что другая часть макета слева осталась прежней (не обращайте внимания на значок маленького пальца вверх).

Другой пример:

Зефирка:

Зефир

Нуга:

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

Я использую следующий стиль для кнопок:

<style name="AppTheme.Button" parent="Widget.AppCompat.Button">
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">@color/colorPrimaryDark</item>
        <item name="android:backgroundTint" tools:targetApi="lollipop">@color/colorTextBrightPrimary</item>
        <item name="backgroundTint" >#FFFFFF</item>
        <item name="colorButtonNormal">@color/colorTextBrightPrimary</item>
    </style>
    <style name="AppTheme.Button.Accent" parent="AppTheme.Button">
        <item name="android:textColor">@color/colorTextBrightPrimary</item>
        <item name="android:backgroundTint" tools:targetApi="lollipop">@color/colorAccent</item>
        <item name="backgroundTint" >@color/colorAccent</item>
        <item name="colorButtonNormal">@color/colorAccent</item>
    </style>

В то время как кнопка SHARE является настраиваемым представлением, расширяющим AppCompatButton, кнопки аутентификации Google и Facebook — это просто AppCompatButtons. В любом случае, все они выглядели по-разному непосредственно перед обновлением, и больше ничего не менялось ни в коде, ни в устройстве (размер текста и масштаб одинаковые).

Есть идеи, что происходит? Как сделать так, чтобы эти макеты оставались одинаковыми на разных устройствах/ОС?


comment
Используя Layout Inspector в Android Studio, я могу прочитать, что он разрешается в 176 пикселей для Marshmallow и 132 пикселей для Nougat (те же значения для mMeasuredHeight) - есть ли какие-либо поля? Изменились ли эти поля? Есть ли какие-либо отступы в любом контейнере, внутри которого находится кнопка SHARE? Эта прокладка изменилась? Если вы посмотрите на Configuration и DensityMetrics, изменилась ли их плотность?   -  person CommonsWare    schedule 16.03.2017
comment
@CommonsWare В обоих случаях нет полей. Заполнение контейнера равно 0 в обоих случаях. Однако заполнение кнопки изменилось. Nougat 48 40 48 40 и Marshmallow 36 30 36 30 для левого верхнего правого нижнего края соответственно. Я нигде не устанавливаю отступы в коде   -  person Voy    schedule 16.03.2017
comment
Хорошо, возможно, они изменили отступ по умолчанию на кнопке. Это объяснило бы часть, хотя, возможно, и не всю разницу. Вы можете попробовать определить отступы в своем стиле и посмотреть, насколько это поможет.   -  person CommonsWare    schedule 16.03.2017
comment
@CommonsWare Извините, я допустил ошибку, это было дополнение Marshmallow 48/40 и Nougat 36/30 - это не имеет смысла, не так ли? Почему разные разрешенные высоты? Я попытался изменить набивку, но, как и ожидалось, это еще больше способствовало набивке.   -  person Voy    schedule 16.03.2017
comment
Я продолжал предполагать, что кнопка, которую можно рисовать по умолчанию, могла быть изменена, отсюда и разница, и поэтому я создал свой собственный рисунок, чтобы я мог лучше контролировать отступы и размер. Не идеальное решение, так как рябь работает не так хорошо, как в оригинале, поэтому на самом деле это не ответ на вопрос. Любые идеи или наводки в теме были бы замечательными!   -  person Voy    schedule 16.03.2017
comment
Вы говорите, что переключение фона кнопки на собственный рисунок устранило проблему с размером?   -  person CommonsWare    schedule 16.03.2017
comment
Да, теперь то же самое на всех моих устройствах, Galaxy S3 и двух S7.   -  person Voy    schedule 16.03.2017


Ответы (1)


Drawable может иметь собственное дополнение. В случае файла PNG с девятью патчами это просто прозрачные пиксели за пределами фактической непрозрачной части изображения/изменения размера. В случае ShapeDrawable вы можете напрямую объявить заполнение в XML. И так далее. Это может отображаться или не отображаться как «заполнение» в таких инструментах, как Layout Inspector, поскольку они сосредоточены на заполнении, объявленном для виджетов.

Поскольку у предыдущего фона, который вы использовали, была проблема, а у заменяющего фона нет, я предполагаю, что проблема заключается в такого рода неявном заполнении.

У вас есть два подхода, чтобы попытаться справиться с этим:

  • Рискованный, но простой подход состоит в том, чтобы попробовать использовать отрицательное заполнение на самой кнопке в res/values-v24/ варианте ваших ресурсов стиля (или, при желании, использовать согласованный ресурс измерения в стиле и изменять значения измерения на основе -v25 или нет). . Вам придется немного повозиться, чтобы попытаться получить значения, которые «отменяют» изменение. Я называю это «рискованным», поскольку не имею ни малейшего представления о том, насколько хорошо Android уважает отрицательное заполнение.

  • Усугубляющий подход заключается в том, чтобы попытаться найти фактический фон кнопки, который вы использовали раньше, и посмотреть, что в нем изменилось. Drawables будут объявлены либо в темах appcompat-v7, либо в темах платформы, а сами фактические drawables будут определены либо в appcompat-v7, либо в платформе.

person CommonsWare    schedule 16.03.2017