安卓:无法为下拉列表添加样式分隔线

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个回答

25

我有一个非常简单的Activity,其中包含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>

而在我的Activity中,我有:

    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存储库。


谢谢您的回复 - 那个项目现在已经有所进展,我现在没有时间测试您的示例,但是我已经点赞了您的回复,谢谢。 - Russ
1
FYI:问题在下拉菜单样式中的android前面有@,答案没有。 - csga5000

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 STYLES ADD it(添加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));

如果这对您有用,请让我知道!祝您有美好的一天!


1

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

编辑

进一步搜索发现了以下内容:

SO Answer

基本上说,您展示的尝试应该可以实现...虽然它提到在您的活动主题中设置该样式,而您没有提到这样做。


谢谢您的回复。我上面发布的主题是活动主题,在活动中其他元素都正常工作。我曾考虑使用带有线条的图像作为项目的背景,但我宁愿学习“正确”的做法,而不是将其弄巧成拙。 - Russ
我能理解那种情绪。:) 不幸的是,我目前没有更好的答案/想法。 - Barak

0

在被接受的答案中,style方法很好用,直到你需要两个具有不同分隔符颜色的下拉框。

以下是我发现的替代方法:

a)将spinner的popupBackgroundColor属性设置为所需的分隔符颜色。这将使整个列表项的背景(包括我们认为的分隔符空间)都变成所需的颜色。

b)将spinners适配器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>

layout/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将不起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接