定制微调器的间距

Lau*_*ent 7 android android-appcompat android-layout android-spinner drop-down-menu

旋转器提供两种状态.第一个和默认状态(状态A)显示当前选定的值.第二个(状态B)显示触摸微调器显示时的下拉菜单.

状态A和B的例子

默认情况下,左填充被添加到在状态A和B中显示的项目我想删除它被显示在当前所选的值(状态A),但保留它当项目被显示在下拉菜单中(状态B) .

由于填充设置与CheckedTextView中创建微调时指定的布局中,我第一次尝试是传递给微调构造包含空填充一个CheckedTextView自定义布局.这样,左边的填充在状态A中消失,但也在状态B中消失.但是,我的目标是将其保留在状态A.

我的第二次尝试是在我的主题定义中自定义android:dropDownSpinnerStyle.由于更改android:dropDownSpinnerStyle的背景颜色仅更改状态A中项目的背景颜色,我的想法是用负值覆盖marginLeft或paddingLeft.不幸的是,它没有任何效果.

鉴于负边距/填充似乎没有被考虑在内,我尝试了相反的做法.首先,我使用了自定义项目布局(如我第一次尝试所述),以便删除两个状态(A和B)上的左边距.其次,我已经为属性android定义了一个自定义样式:dropDownListViewStyle.不幸的是,在最后一个属性中使用正的marginLeft值无效.因此,我设置了paddingLeft.它工作,并允许我只获得状态B的左边距.但是,左侧空间也适用于背景触摸颜色(参见下图).

在此输入图像描述

我认为如果我想要完全填充下拉菜单宽度的触摸背景颜色,则只应更改状态A的样式.任何想法,建议或例子都受到欢迎.

以下是我第三次尝试的主题定义:

<style name="Theme.App.Base" parent="Theme.App">
    ...
    <item name="android:dropDownListViewStyle">@style/Widget.Spinner.DropDown.ListView</item>
</style>

<style name="Widget.Spinner.DropDown.ListView" parent="Widget.AppCompat.ListView.DropDown">
    <item name="android:paddingLeft">16dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)

Vik*_*ram 31

状态A采用以下样式:

// Theme (Base) // Theme.AppCompat
@android:style/Widget.TextView.SpinnerItem

// Holo & Holo Light
@android:style/Widget.Holo.TextView.SpinnerItem
Run Code Online (Sandbox Code Playgroud)

这里的属性是spinnerItemStyle.

此外,提供的填充不是 paddingLeft,但是paddingStart- 支持LTR和RTL语言.同样,paddingEnd设置而不是paddingRight.此信息适用于API> = 17.

如果您正在使用AppCompat,您仍将覆盖该spinnerItemStyle属性,但提供paddingLeftpaddingRight.

例:

<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>
Run Code Online (Sandbox Code Playgroud)

40dp如果将此样式设置为有效,则该值用于测试.这应该只填充State A(40dp),保留State B默认填充8dp.一旦确认,您可以制作它0dp,或根据您的要求.

这是我得到的结果:

在此输入图像描述

更新:

参考示例项目 - MainActivity:

spinner.setAdapter(ArrayAdapter.createFromResource(this,
            R.array.planets_array, android.R.layout.simple_spinner_item));
Run Code Online (Sandbox Code Playgroud)

通过给适配器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"/>
Run Code Online (Sandbox Code Playgroud)

注意style适用于此TextView.之前,我曾建议您覆盖此属性.它奏效了.但由于这种布局用于两种状态,因此结果并不理想.

事实上,上面的声明(尽管目前没有做任何事情)更有希望:

ArrayAdapter.createFromResource(this,
            R.array.planets_array, android.R.layout.simple_spinner_item)
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Run Code Online (Sandbox Code Playgroud)

通过使用setDropDownViewResource(int),您将允许引入不同的样式属性.在这种情况下,A国将由国家A代表,android.R.layout.simple_spinner_itemB国将使用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"/>
Run Code Online (Sandbox Code Playgroud)

现在我们可以覆盖另一个属性 - spinnerDropDownItemStyle并给状态B一个完全不同的外观.但是,我们不会.在棒棒糖,spinnerDropDownItemStyle指向风格Widget.Material.DropDownItem.Spinner,其设置paddingX8dp.并且你说你对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);
Run Code Online (Sandbox Code Playgroud)

并且,如果您还没有,请将其添加到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>
Run Code Online (Sandbox Code Playgroud)

您还应该创建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>
Run Code Online (Sandbox Code Playgroud)