说明:
在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>
为例:
屏幕截图结合了两个独立的截图:
答案 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更新。
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
。再次将其保存在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-list
的{{1}}等于android:paddingEnd
b)将第一项0dp
减半至android:width
c)删除了第二个项目的24dp
属性
这些变化使背景更薄,通过剥离它的侧面,但这种方法保留了涟漪效应。如果需要,请随意使用自己的自定义值。
下载到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中。