Внутреннее покрытие Spinner больше на Android 6.0.1
Введение:
С новой версией Android 6.0.1 кажется, что Android внес некоторые изменения в компонент Spinner, потому что по умолчанию внутренняя прокладка вокруг вниз моркови немного больше.
Я заметил это в приложении, где я ничего не изменил в коде, но просто обновил ОС на устройстве, и все же у проигрывателей разные размеры.
Ситуация:
У меня есть 2 прядильника один рядом с другим в RelativeLayout
(помните остальные компоненты, я добавил все, чтобы вы могли видеть эту часть макета - удалили абсолютно ненужные свойства или объекты просмотра)
<RelativeLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/container_for_buttons_on_the_right"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true">
<!-- Buttons here-->
</LinearLayout>
<android.support.v7.widget.AppCompatSpinner
android:id="@+id/spinner_1"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ViewSwitcher
android:id="@+id/spinner_switch"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_toEndOf="@id/spinner_1"
android:layout_toLeftOf="@id/container_for_buttons_on_the_right"
android:layout_toRightOf="@id/spinner_1"
android:layout_toStartOf="@id/container_for_buttons_on_the_right"
android:inAnimation="@anim/fade_in"
android:outAnimation="@anim/fade_out">
<android.support.v7.widget.AppCompatSpinner
android:layout_width="wrap_content"
android:layout_height="match_parent" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- ImageView properties are incomplete but I need it there.-->
</ViewSwitcher>
</RelativeLayout>
Макет, используемый адаптером Spinner для метода getView()
, таков:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="48dp"
android:orientation="horizontal"
android:paddingLeft="8dp"
android:paddingRight="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:ellipsize="end"
android:gravity="center_vertical"
android:singleLine="true"
tools:text="Test" />
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0"
android:gravity="center"
android:paddingLeft="4dp"
android:singleLine="true"
android:textColor="@color/text_primary"
android:textSize="@dimen/text_size_body"
tools:ignore="RtlHardcoded,RtlSymmetry"
tools:text="7%" />
</LinearLayout>
вышеописанное:
Снимок экрана объединен с двумя отдельными снимками экрана:
- Верхняя часть находится на устройстве Nexus 5, работающем на Android 6.0
- Ниже приведен пример устройства Nexus 5, но работает на Android 6.0.1
![screenshot]()
Использование AppCompatSpinner из библиотеки поддержки не изменяет поведение. Используемая версия поддерживаемой библиотеки 23.1.1
Ответы
Ответ 1
С минимальными усилиями я смог исправить это, создав собственный фон для счетчика.
С помощью AppCompatSpinner
мне пришлось создать 2 xmls для фона, позвоните на этот spinner_background.xml
:
1. Сначала переходим в папку drawable
и выглядим так: spinner_background.xml
:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="transparent">
<item
android:width="24dp"
android:height="24dp"
android:drawable="@drawable/selector_background_borderless"
android:gravity="end|center_vertical" />
<item android:drawable="@drawable/bg_spinner_anchor" />
</layer-list>
Где selector_background_borderless
- простой селектор (я добавил минимальные элементы, которые вам нужны, вы могли бы изучить его альтернативу для v21+. На самом деле я бы рекомендовал вам это сделать):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#19000000" android:state_pressed="true" />
<item android:drawable="@android:color/transparent" />
</selector>
И bg_spinner_anchor
- это 9patch PNG для каретки. Я использовал эти активы: bg_spinner_anchor
2.. Второй идет в папку drawable-v23
для правильной поддержки пульсации и выглядит так: spinner_background.xml
:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingEnd="16dp"
android:paddingLeft="0dp"
android:paddingMode="stack"
android:paddingRight="0dp"
android:paddingStart="0dp">
<item
android:width="24dp"
android:height="24dp"
android:drawable="@drawable/selector_background_borderless"
android:gravity="end|center_vertical" />
<item
android:width="24dp"
android:height="24dp"
android:drawable="@drawable/ic_spinner_caret"
android:gravity="end|center_vertical" />
</layer-list>
Где ic_spinner_caret
- это вектор, используемый в исходном коде Android, похожий на этот. Вы также должны добавить это в свою папку drawable-v23
:
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:pathData="M7,10l5,5,5-5z"
android:fillColor="#524e4a"/>
</vector>
Кредиты переходят к alanv из набора инструментов Android UI для руководства!
Ответ 2
У меня была такая же проблема, и я планировал отказаться от обновления 6.0.1 только для v23.
===
- Убедитесь, что ваш
Spinner
имеет прикрепленный к нему стиль. Например, стиль с именем Widget.Spinner
в примере ниже:
<Spinner
android:id="@+id/spinner_1"
style="@style/Widget.Spinner"
android:layout_width="64dp"
android:layout_height="64dp"/>
- Создать (если его еще не существует)
styles.xml
в каталоге values-v23
(изменения будут применены только к API v23). Например, см. Пример определения стиля Widget.Spinner
ниже:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Widget.Spinner" parent="Widget.AppCompat.Spinner">
<item name="android:background">@drawable/spinner_background_material</item>
</style>
</resources>
Родитель стиля Widget.AppCompat.Spinner
, и он переопределяет его android:background
с тем, который мы будем откатывать из источника 6.0.1.
Обратите внимание, что если вы настроите таргетинг на другие версии, вам нужно добавить стандартный styles.xml
в каталог values
с записью
<style name="Widget.Spinner" parent="Widget.AppCompat.Spinner"/>
так как проще определить другой общий стиль, а не разные XML файлы макета, и ваш проект должен иметь общий styles.xml
в каталоге values
, так или иначе?:)
- Ввести
spinner_background_material.xml
из https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/drawable/. Сохраните его под drawable-v23
снова, мы просто убедитесь, что мы меняем только API v23.
Содержимое файла по умолчанию:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingMode="stack"
android:paddingStart="0dp"
android:paddingEnd="48dp"
android:paddingLeft="0dp"
android:paddingRight="0dp">
<item
android:gravity="end|fill_vertical"
android:width="48dp"
android:drawable="@drawable/control_background_40dp_material" />
<item
android:drawable="@drawable/ic_spinner_caret"
android:gravity="end|center_vertical"
android:width="24dp"
android:height="24dp"
android:end="12dp" />
</layer-list>
Теперь это файл, который вы, возможно, захотите настроить. Я внес изменения в этот файл для настройки позиции каретки:
а) установить layer-list
android:paddingEnd
равным 0dp
б) сократил вдвое первый элемент android:width
до 24dp
c) удалил второй атрибут android:end
Изменения сделали фоном более тонким, сняв его, но подход сохранил эффект пульсации. Не стесняйтесь играть со своими собственными значениями, если это необходимо.
- Изменения выше не будут скомпилированы, так как потребуется больше файлов, чтобы они были добавлены для файлов, указанных выше.
Загрузите в drawable-v23
(см. ссылку выше):
a) control_background_40dp_material.xml
b) ic_spinner_caret.xml
Загрузите в color-v23
:
a) control_highlight_material.xml
из https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/color/ (возможно, этот файл также находится в drawable-v23
, но позволяет следовать шаблону исходных местоположений источника для Теперь). Обратите внимание, что файл @dimen/highlight_alpha_material_colored
выбирается из appcompat-v7
, если вы его используете:) Если нет, вы можете получить от него значение:
<item format="float" name="highlight_alpha_material_colored" type="dimen">0.26</item>
===
Решение не самое лучшее, поскольку вам необходимо перенести файлы, которые вы изначально не владели. Кроме того, вы можете отслеживать возможные обновления v23 для любых будущих изменений. Но, по крайней мере, изменения содержатся только в v23.