我正在努力实现两件事:
使Spinners继承自AppCompat主题。
在“工具栏”弹出菜单中,将图标添加到微调器元素。
由于我无法达到第一点,因此我将重点放在此点上,但我也想稍后再添加图标。现在,我的“工具栏”弹出菜单继承了AppCompat主题,但“微调框”没有,如下图所示。第一个图像显示了工具栏上的(正确)弹出菜单,而第二个图像显示了Spinner中的弹出菜单。这是一个不继承样式的微调框示例。还是应该使用这种弹出菜单样式?
我已经尝试了很多事情,所以这个问题可能有多个重复,但是我无法使其工作。下面的代码有什么问题?正确继承主题之后,以后如何添加图标? SDK的最低版本为16,目标为23。
themes.xml:
<resources>
<style name="MyTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/my_brown</item>
<item name="colorPrimaryDark">@color/my_dark_gray</item>
<item name="colorAccent">@color/my_green</item>
<!-- This is just a test, it makes no difference. -->
<item name="android:spinnerStyle">@style/MySpinnerStyle</item>
</style>
<style name="MyTheme" parent="MyTheme.Base"></style>
<!--
ActionBar style, applied directly to XML elements
-->
<style name="MyActionBarStyle" parent="@style/Widget.AppCompat.ActionBar">
<item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@color/my_brown</item>
<item name="android:minHeight">?attr/actionBarSize</item>
</style>
<!--
Spinner style, for testing. Also tried applied directly to xml Spinners.
-->
<style name="MySpinnerStyle" parent="@style/Widget.AppCompat.Spinner">
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<item name="android:popupMenuStyle">@style/Widget.AppCompat.Light.PopupMenu</item>
</style>
</resources>
微调器的设置非常简单:
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, mCategories);
mSpinner.setAdapter(adapter);
其中,
mSpinner
是膨胀的Spinner,而mCategories
是String数组。在XML中,微调器定义为<Spinner
android:id="@+id/my_spinner"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
我尝试将各种样式直接添加到微调器中,但是它不起作用。
在我的AndroidManifest.xml中,我已将以下内容添加到Application标签:
android:theme="@style/MyTheme"
最佳答案
我设法通过更改如下主题和样式来做到了(或非常接近):
只需添加到您的主题:
<item name="android:spinnerDropDownItemStyle">@style/MySpinnerItem</item>
然后为MySpinnerItem创建从
Widget.AppCompat.DropDownItem.Spinner
继承的样式:<style name="MySpinnerItem" parent="@style/Widget.AppCompat.DropDownItem.Spinner">
<item name="android:textColor">@color/your_text_color</item>
<item name="android:textSize">16sp</item>
<item name="android:paddingLeft">16dp</item>
<item name="android:paddingStart" tools:targetApi="jelly_bean_mr1">16dp</item>
<item name="android:paddingRight">16dp</item>
<item name="android:paddingEnd" tools:targetApi="jelly_bean_mr1">16dp</item>
</style>
就是AppCompat主题了。
最后,如果要向列表项添加图标,则必须创建一个自定义布局并以编程方式对其进行设置。您可以按照本教程http://android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html中的说明进行操作。
基本上,您必须:
创建自定义布局
创建一个继承自
ArrayAdapter
的自定义适配器实现
getCutomView()
方法来为每个项目设置不同的图像最后使用
MyCustomAdapter.createFromResource(this, R.array.my_data, R.layout.my_cutom_item_layout);
将适配器设置为微调器