状态 A 采用以下样式:
// Theme (Base) // Theme.AppCompat
@android:style/Widget.TextView.SpinnerItem
// Holo & Holo Light
@android:style/Widget.Holo.TextView.SpinnerItem
这里的属性是spinnerItemStyle。
此外,提供的填充不是 paddingLeft,而是 paddingStart - 以支持 LTR 和 RTL 语言。同样,设置paddingEnd 而不是paddingRight。此信息适用于 API >=17。
如果您使用 AppCompat,您仍将覆盖 spinnerItemStyle 属性,但提供 paddingLeft 和 paddingRight。
例子:
<style name="Theme.App.Base" parent="Theme.App">
...
<item name="android:spinnerItemStyle">@style/TextViewSpinnerItem</item>
</style>
<style name="TextViewSpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem">
<item name="android:paddingLeft">40dp</item>
<item name="android:paddingRight">40dp</item>
</style>
40dp 值用于测试设置此样式是否有效。这应该只填充State A(40dp),留下State B的默认填充8dp。确认后,您可以0dp,或根据您的要求。
这是我得到的结果:
更新:
参考示例项目-MainActivity:
spinner.setAdapter(ArrayAdapter.createFromResource(this,
R.array.planets_array, android.R.layout.simple_spinner_item));
通过给适配器android.R.layout.simple_spinner_item,您告诉它状态A和状态B都使用布局。这是一个问题,因为这种布局的定义方式:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:textAlignment="inherit"/>
注意style 应用于此TextView。早些时候,我曾建议您覆盖此属性。它奏效了。但由于这两种状态都使用了这种布局,所以结果并不理想。
事实上,上面的陈述(虽然目前没有做任何事情)更有希望:
ArrayAdapter.createFromResource(this,
R.array.planets_array, android.R.layout.simple_spinner_item)
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
通过使用setDropDownViewResource(int),您将允许引入不同的样式属性。在这种情况下,状态 A 将由 android.R.layout.simple_spinner_item 表示,状态 B 将使用 android.R.layout.simple_spinner_dropdown_item。
我们来看看android.R.layout.simple_spinner_dropdown_item:
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="?android:attr/dropdownListPreferredItemHeight"
android:ellipsize="marquee"/>
现在我们可以覆盖另一个属性 - spinnerDropDownItemStyle - 并给状态 B 一个完全不同的外观。但是,我们不会。在 Lollipop 上,spinnerDropDownItemStyle 指向样式Widget.Material.DropDownItem.Spinner,它将paddingX 设置为8dp。你说你对状态 B 的默认填充没问题。
所以,这就是你需要的:
// Create an ArrayAdapter
ArrayAdapter<CharSequence> mAdapter = ArrayAdapter.createFromResource(this,
R.array.planets_array, android.R.layout.simple_spinner_item);
// State B
mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
并且,如果您还没有,请将其添加到 values/styles.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:spinnerItemStyle">@style/TextViewSpinnerItem</item>
</style>
<style name="TextViewSpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem">
<item name="android:paddingLeft">0dp</item>
<item name="android:paddingRight">0dp</item>
</style>
您还应该创建values-v21/styles.xml 并添加:
<style name="TextViewSpinnerItem" parent="@android:style/Widget.Material.TextView.SpinnerItem">
<item name="android:paddingLeft">0dp</item>
<item name="android:paddingRight">0dp</item>
</style>