锭床项目按了蓝色背景

时间:2014-03-11 10:05:37

标签: android spinner

我使用微调器显示下拉列表。 我希望列表中的项目具有圆角。 所以我使用9-patch包含一个带圆角的图像(在角落的外侧是透明的)用于视图项目背景和一个选择器,以便在按下时显示不同颜色的9-patch。

问题:当我按下微调器列表中的项目时,我可以在角落看到蓝色背景,其中9补丁是透明的。

我似乎无法摆脱按下项目时出现的蓝色背景。如果我删除9个补丁和微调器中的任何设置,我可以看到列表中的项目视图默认为灰色,按下时为蓝色。

我还尝试不使用9个色块作为背景,只使用颜色选择器,并将选择器中的按下颜色设置为透明。然后当我按下项目时,它不是透明的,而是蓝色的。我认为列表中的视图非常透明,但按下时背景中仍然有蓝色......

我使用自定义SpinnerAdapter来创建项目视图。 这是简化的代码:

   private class MySpinnerAdapter implements SpinnerAdapter {
        @Override
        public View getDropDownView(int i, View recycledView, ViewGroup viewGroup) {
            View view = new View(context);
            view.setBackground(context.getResources().getDrawable(R.drawable.testspinner));
            view.setMinimumHeight(100);
            return (View) view;
        }
} 

用于背景的选择器。这里只有一种颜色,没有9补丁。压制的颜色应该是透明的:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
            android:state_pressed="true"
            android:drawable="@android:color/transparent" />
    <item
            android:drawable="@android:color/holo_purple" />

</selector>

我在微调器上设置自定义适配器:

    spinner.setAdapter(new MySpinnerAdapter());

并且从XML布局中获取微调器:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent" android:layout_height="wrap_content">

<Spinner
        android:id="@+id/myDropDown"
        android:spinnerMode="dropdown"
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"
        android:dropDownWidth="match_parent"/>
</LinearLayout>

我尝试在Spinner上设置许多不同的属性,并尝试了一些样式属性,但我无法摆脱这个蓝色背景......

2 个答案:

答案 0 :(得分:4)

  

问题:当我按下微调器列表中的项目时,我可以看到一个   角落里的蓝色背景,9贴片是透明的。

我认为blue background来自android:selectableItemBackground属性。要更改此属性,请将以下内容添加到styles.xml中的应用程序主题:

<item name="android:selectableItemBackground">@drawable/whicheverDrawable</item>

供参考:默认情况下,selectableItemBackground指向API 19中的以下drawable(适用于Theme.Holo)。您应该以类似的方式定义whicheverDrawable

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

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_disabled_holo_dark" />
    <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/list_selector_disabled_holo_dark" />
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition_holo_dark" />
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition_holo_dark" />
    <item android:state_focused="true" android:drawable="@drawable/list_focused_holo" />
    <item android:drawable="@color/transparent" />
</selector>

在您的情况下,您可以为另一个drawable定义圆角,用于statePressed中的whicheverDrawable

答案 1 :(得分:4)

感谢@Vikram指出样式的使用。

然而,经过调查后发现,Spinner中按下的项目的背景并非来自您建议的属性,而是来自android:listSelector。所以我可以解决这个问题:

在styles.xml中定义一个新样式:

<style name="MyListView">
    <item name="android:listSelector">@android:color/transparent</item>
</style>

在themes.xml中定义一个新主题:

<style name="MyTheme" parent="@android:style/Theme.NoTitleBar.Fullscreen">
    <item name="android:dropDownListViewStyle">@style/MyListView</item>
</style>

将主题应用于我在AndroidManifest.xml中的活动:

<activity android:name=".MyActivity"
...
android:theme="@style/MyTheme">