11

我尝试对 Spinner 下拉项应用波纹效果,如下所示:

活动.java

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            this, R.array.array_name, R.layout.simple_spinner_dropdown_item);
    adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
    Spinner mSpinner = (Spinner) findViewById(R.id.spinner);
    mSpinner.setAdapter(adapter);

simple_spinner_dropdown_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:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@drawable/spinner_ripple"
   android:ellipsize="marquee"
   android:gravity="center_horizontal"
   android:padding="10dip"
   android:singleLine="true"
   android:textSize="14sp" />

spinner_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
   <ripple android:color="?android:attr/colorControlHighlight">
       <item><shape>
                  <solid android:color="@android:color/white" />
              </shape>
       </item>
   </ripple>
</item>
</selector>

但在下拉列表中,它仅适用于第一项,并且仅当当前选定的项目与第一项不同时。在所有其他情况下,它会用波纹颜色填充背景项目(因为没有波纹效果)。我的代码哪里错了?

已经尝试过:在下拉项目布局的背景上设置固定颜色并在 Spinner 元素下移动波纹效果不起作用,如下所示:

simple_spinner_dropdown_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@android:id/text1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@android:color/white"
   android:ellipsize="marquee"
   android:gravity="center_horizontal"
   android:padding="10dip"
   android:singleLine="true"
   android:textSize="14sp" />

活动布局.xml

<Spinner
   android:id="@+id/spinner"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:drawSelectorOnTop="true"
   android:dropDownSelector="@drawable/spinner_ripple" />
4

3 回答 3

6

您的第二种方法是正确的,但正如在这个问题中提到的,android:dropDownSelector属性不起作用,这是一个众所周知的错误。

另外,如果要更改下拉背景颜色,则需要设置Spinner's android:popupBackground,而不是设置下拉项的背景。

整个解决方案将是这样的:

popup_background.xml

<!--Based on Android's popup_background_material.xml-->
<!--This changes the background of the drop-down-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
    <corners android:radius="2dp" />
    <solid android:color="@android:color/white" />
</shape>

样式.xml

<resources>
    <style name="AppTheme" parent="android:Theme.Material.Light">
        <!--Workaround for the Android bug-->
        <item name="android:dropDownListViewStyle">@style/Theme.MyListView</item>
    </style>

    <style name="Theme.MyListView" parent="@android:style/Widget.Material.ListView.DropDown">
        <item name="android:listSelector">@drawable/spinner_ripple</item>
    </style>
</resources>

活动.xml

...
<Spinner
    android:id="@+id/spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:dropDownSelector="@drawable/spinner_ripple"
    android:popupBackground="@drawable/popup_background"
    />
...

spinner_ripple.xml(原始)

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <ripple android:color="?android:attr/colorControlHighlight">
            <item>
                <shape>
                    <solid android:color="@android:color/white" />
                </shape>
            </item>
        </ripple>
    </item>
</selector>
于 2015-01-17T22:30:25.947 回答
5

如果你想让你的下拉列表项默认为白色并仅在用户触摸它们时以涟漪效果突出它们,则需要在spinner_ripple.xml可绘制对象中实现正确的状态列表:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <ripple android:color="?android:attr/colorControlHighlight" />
    </item>
    <item android:state_pressed="false">
        <shape>
            <solid android:color="@android:color/white" />
        </shape>
    </item>
</selector>

这里,android:state_pressed="true"表示选择器项仅在用户实际按下视图时才应用。如果您想支持其他选择器状态,请查看StateListDrawable参考。

请记住,AppCompat-v7 v21 不支持涟漪效应,根据官方Android 开发者博客

为什么pre-Lollipop上没有涟漪?很多让 RippleDrawable 顺利运行的原因是 Android 5.0 的新 RenderThread。为了优化以前版本的 Android 的性能,我们暂时不使用 RippleDrawable。

所以它只适用于棒棒糖。

于 2015-01-17T13:47:54.570 回答
0

我相信你需要两层spinner_ripple.xml

<!-- Background -->
<ripple android:color="#ff00ff00">
    <item android:drawable="@android:color/black" />
<ripple />

<!-- Ripple color -->
<ripple android:color="#ff00ff00">
    <item android:drawable="@android:color/white" />
<ripple />
于 2015-01-13T15:03:44.497 回答