Подтвердить что ты не робот

Внутреннее покрытие 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

  • РЕДАКТИРОВАТЬ 1

Использование AppCompatSpinner из библиотеки поддержки не изменяет поведение. Используемая версия поддерживаемой библиотеки 23.1.1

4b9b3361

Ответ 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"/>
  1. Создать (если его еще не существует) 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, так или иначе?:)

  1. Ввести 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

Изменения сделали фоном более тонким, сняв его, но подход сохранил эффект пульсации. Не стесняйтесь играть со своими собственными значениями, если это необходимо.

  1. Изменения выше не будут скомпилированы, так как потребуется больше файлов, чтобы они были добавлены для файлов, указанных выше.

Загрузите в 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.