我正在努力实现两件事:


使Spinners继承自AppCompat主题。
在“工具栏”弹出菜单中,将图标添加到微调器元素。


由于我无法达到第一点,因此我将重点放在此点上,但我也想稍后再添加图标。现在,我的“工具栏”弹出菜单继承了AppCompat主题,但“微调框”没有,如下图所示。第一个图像显示了工具栏上的(正确)弹出菜单,而第二个图像显示了Spinner中的弹出菜单。这是一个不继承样式的微调框示例。还是应该使用这种弹出菜单样式?

android - 带图标的动态微调器继承了AppCompat主题-LMLPHP
android - 带图标的动态微调器继承了AppCompat主题-LMLPHP

我已经尝试了很多事情,所以这个问题可能有多个重复,但是我无法使其工作。下面的代码有什么问题?正确继承主题之后,以后如何添加图标? 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);将适配器设置为微调器

09-30 18:16
查看更多