Lau*_*ent 7 android android-appcompat android-layout android-spinner drop-down-menu
旋转器提供两种状态.第一个和默认状态(状态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
属性,但提供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>
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_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"/>
Run Code Online (Sandbox Code Playgroud)
现在我们可以覆盖另一个属性 - spinnerDropDownItemStyle
并给状态B一个完全不同的外观.但是,我们不会.在棒棒糖,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);
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)
归档时间: |
|
查看次数: |
11536 次 |
最近记录: |