13

我正在尝试为我的第一个 Android 应用程序创建一个主题,它让我走上了弯路。我终于设法弄清楚如何为下拉列表中的项目设置样式,但现在我无法更改列表项目之间分隔线的颜色。我在 stackoverflow 上搜索了类似的问题,并尝试了几十种组合,但似乎没有任何效果。

这是我的 styles.xml 文件(为清楚起见而缩写):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyTheme" parent="android:Theme.Light">
    <item name="android:spinnerStyle">@style/spinnerStyle</item>
    <item name="android:spinnerDropDownItemStyle">@style/spinnerDropDownItemStyle</item>    
    <item name="android:dropDownListViewStyle">@style/spinnerListViewStyle</item>
  </style>

  <style name="spinnerStyle" parent="@android:style/Widget.Spinner">
      <item name="android:background">@drawable/my_theme_spinner</item>
  </style>

  <style name="spinnerDropDownItemStyle" parent="@android:style/Widget.DropDownItem.Spinner">
      <item name="android:background">@drawable/my_theme_spinner_item</item>
      <item name="android:paddingLeft">5dp</item>
      <item name="android:gravity">center_vertical</item>
  </style>

  <style name="spinnerListViewStyle" parent="@android:style/Widget.ListView.DropDown">
      <item name="android:height">3dp</item>
      <item name="android:dividerHeight">3dp</item>
      <item name="android:divider">@color/divider</item>
  </style>
</resources>

不管我做什么,我只是在项目之间得到一个 1dp 浅灰色分隔线(用我的浅色列表项背景几乎看不到它) - 分隔线的高度和颜色都不会受到影响(我也尝试将它设置为可绘制,也没有效果)。我究竟做错了什么?

4

4 回答 4

25

我有一个非常简单的 Spinner 活动,它适用于以下情况。我看到的唯一区别是你有一个<item name="android:height">3dp</item>,而我根本没有。

<style name="TestSpinnerStyle" parent="android:style/Widget.ListView.DropDown">
    <item name="android:divider">#ff0000</item>
    <item name="android:dividerHeight">5dp</item>
</style>


<style name="SampleTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:dropDownListViewStyle">@style/TestSpinnerStyle</item>
</style>

在我的活动中,我有:

    Spinner spinner = (Spinner) findViewById(R.id.spinner);
    List<String> list = new ArrayList<String>();
    list.add("list 1");
    list.add("list 2");
    list.add("list 3");
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, list);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    spinner.setAdapter(dataAdapter);

然后对于主要布局,我有以下 XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Hello World, StylingActivity"
            />
    <Spinner android:id="@+id/spinner"
             android:layout_width="250dp"
             android:layout_height="40dp"
             />
</LinearLayout>

这是屏幕截图

示例活动截图

如果您无法从那里开始工作,我可以为您将整个内容推送到 github 存储库。

于 2012-10-30T17:15:56.040 回答
1

您可以在您使用的下拉布局中添加一条水平线,这将有效地创建一个分隔线。

编辑

一些进一步的搜索发现了这一点:

所以回答

这基本上说明了您在上面尝试做的事情应该可以工作......尽管它提到在您的活动主题中设置该样式并且您没有提到这样做。

于 2012-06-06T14:58:39.167 回答
1

您可以在 layout.xml 中执行此操作

     <Spinner
                android:id="@+id/sp_to_create"
                android:layout_width="match_parent"
                android:layout_height="32dp"
                android:layout_marginBottom="10dp"
                style="@style/spinner_style"
                android:prompt="@string/to_type_prompt" />

XML 样式添加它

 <style name="spinner_style" parent="Widget.AppCompat.ListView.DropDown">
    <item name="android:divider">#d1d1d1</item>
    <item name="android:dividerHeight">0.5dp</item>
</style>

添加到您的活动主题

      <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <item name="android:dropDownListViewStyle">@style/spinner_style</item>
</style>

JAVA文件

your_spinnerList.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, timeOff_type_list));

让我知道它是否对您有用!祝你今天过得愉快!

于 2017-10-11T14:17:52.347 回答
0

接受答案中的样式方法效果很好,直到您需要两个具有不同分隔线颜色的微调器。

这是我发现的替代方法:

a) 将微调器上的 popupBackgroundColor 属性设置为您想要的分隔线颜色。这将为整个列表项的背景着色(包括我们认为作为分隔符的空间)。

b) 将微调器适配器 dropDownViewResource 设置为 CheckedTextView,并将其背景属性设置为其他颜色(或者,如果您希望所选项目具有不同的颜色,则为选择器)。这将覆盖我们在步骤 a 中为除分隔线之外的所有内容设置的颜色。有效地给了我们想要的结果。

所以你将拥有:

drawable/spinner_dropdown_background_selector:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/your_unchecked_color" android:state_checked="false"/>
    <item android:drawable="@color/your_checked_color" android:state_checked="true"/>
    <item android:drawable="@color/your_unchecked_color"/>

</selector>

布局/drop_down_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@android:id/text1"
             android:background="@drawable/spinner_dropdown_background_selector"
             android:textColor="@android:color/white"
             android:singleLine="true"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:ellipsize="marquee" />

您的微调器定义:

<Spinner
        ...
        android:popupBackground="@color/your_divider_color"            
        ...
        />

最后是您的数组适配器定义:

ArrayAdapter<String> dataAdapter = new ...
dataAdapter.setDropDownViewResource(android.R.layout.drop_down_item);
spinner.setAdapter(dataAdapter);

请注意,如果微调器处于对话框模式,则设置 popupBackgroundColor 无效。

于 2015-05-27T08:14:53.307 回答