【问题标题】:Spinner inner padding is larger on Android 6.0.1微调器内部填充在 Android 6.0.1 上更大
【发布时间】:2015-12-16 15:37:09
【问题描述】:

简介:

随着 Android 6.0.1 的新版本,Android 似乎对 Spinner 组件进行了一些更改,因为默认情况下,向下胡萝卜周围的内部填充有点大。

我在一个应用程序上注意到了这一点,我没有修改任何代码,只是更新了设备上的操作系统,但微调器的大小不同。

情况:

我在 RelativeLayout 中有 2 个微调器,一个挨着另一个(请注意其余的组件,我添加了所有内容,以便您可以看到这部分布局 - 删除了完全不必要的属性或视图 ID)

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

举例:

屏幕截图由 2 个单独的屏幕截图组合而成:

  1. 顶部是在运行 Android 6.0Nexus 5 设备上拍摄的
  2. 下面的图片也是在 Nexus 5 设备上拍摄的,但在 Android 6.0.1 上运行

  • 编辑 1

使用支持库中的 AppCompatSpinner 不会改变行为。使用的支持库版本为23.1.1

【问题讨论】:

  • 我们必须在向下插入符号周围添加更多填充以避免显示波纹效果时出现错误。如果您需要恒定大小,请将背景从框架中复制出来并使用它,或者使用 AppCompat。
  • 我确实使用 AppCompat :)。你能告诉我那个填充物的确切尺寸是多少吗?在我看来大约是 8 点或 10 点?
  • 它是 12dp 的结束填充和恒定的 48dp 结束对齐间隙,实际上是 12dp 的开始填充。您可以直接在platforms/android-23/data/res/drawable/spinner_background_material.xml下的Android SDK目录中查看。
  • 感谢您的回复,@alanv。我会从这里拿走。

标签: android android-layout android-spinner android-6.0-marshmallow android-6.0.1-marshmallow


【解决方案1】:

通过为微调器构建自定义背景,我能够以最小的努力解决此问题。

使用AppCompatSpinner我必须为背景创建2个xml,我们称之为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>

来自 Android UI 工具包的积分转到 alanv 以获取指导!

【讨论】:

  • bg_spinner_assets 的链接正在重定向到下载Backstreet_Boys mp3 文件。你能看看这个吗?谢谢
【解决方案2】:

我遇到了同样的问题,我的计划是回滚仅适用于 v23 的 6.0.1 更新。

  1. 确保您的Spinner 具有附加的样式。例如下面示例中名为Widget.Spinner 的样式:
<Spinner
    android:id="@+id/spinner_1"
    style="@style/Widget.Spinner"
    android:layout_width="64dp"
    android:layout_height="64dp"/>
  1. values-v23 目录下创建(如果不存在)styles.xml(更改将仅应用于 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 源回滚

请注意,如果您还针对其他版本,则需要在 values 目录下添加默认的 styles.xml 并带有条目

<style name="Widget.Spinner" parent="Widget.AppCompat.Spinner"/>

因为定义另一个通用样式而不是不同的布局 xml 文件更容易,并且您的项目应该在values 目录下有一个通用的styles.xml,对吧? :)

  1. https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/drawable/ 引入spinner_background_material.xml。再次将其保存在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>

现在,这是您可能要调整的文件。我对此文件进行了更改以调整插入符号的位置:
a) 设置 layer-listandroid:paddingEnd 等于 0dp
b) 将第一项的 android:width 减半为 24dp
c) 删除了第二个项目的android:end 属性

这些更改通过剥离其侧面使背景变薄,但该方法保留了涟漪效果。如果需要,请随意使用您自己的自定义值。

  1. 上述更改将无法编译,因为需要引入更多文件,因为它们将由上述文件引用。

下载到drawable-v23(见上面的链接):
一)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 中。

【讨论】:

  • 感谢您的详细解答。有效!
  • 感谢您发布此 svennu。你用有用的解释为我节省了很多时间!
  • 第二个想法。尝试隐藏插入符号时,这在 API 24 上效果不佳。
猜你喜欢
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多