Android 6.0.1上的Spinner内部填充更大

时间:2015-12-16 15:37:09

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

说明:

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

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

情况:

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

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

为例:

屏幕截图结合了两个独立的截图:

  1. Android 6.0
  2. 上运行的 Nexus 5 设备上的顶部设备
  3. 下面的内容也采用 Nexus 5 设备,但在 Android 6.0.1
  4. 上运行

    screenshot

    • 编辑1

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:4)

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

  1. 确保您的Spinner附有样式。例如,下面示例中名为Widget.Spinner的样式:
  2. <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样式定义示例:
    2. <?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. 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。
      2. 文件的默认内容为:

        <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-list的{​​{1}}等于android:paddingEnd
        b)将第一项0dp减半至android:width
        c)删除了第二个项目的24dp属性

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

        1. 上述更改无法编译,因为需要引入更多文件,因为上述文件会提及这些文件。
        2. 下载到android:end(参见上面的链接):
          a)drawable-v23
          b)control_background_40dp_material.xml

          下载到ic_spinner_caret.xml
          a)来自https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/color/color-v23(此文件可能也位于control_highlight_material.xml下,但我们现在可以遵循原始源位置的模式)。请注意,该文件的drawable-v23是从@dimen/highlight_alpha_material_colored中选取的,如果您使用的话:)如果没有,您可以从中获取它的值:

          appcompat-v7

          解决方案不是最佳解决方案,因为您需要引入原先不拥有的文件。此外,您可能希望监视v23的可能更新,以便将来进行任何更改。但至少这些变化只包含在v23中。