在Android Spinner中更改所选项的背景颜色

12
我正在开发一个安卓应用程序,在我的应用程序中使用了Spinner。我想要改变Spinner中所选项目的背景颜色,以便用户可以轻松地识别当前选定的项目。
我已经查看了这个链接设置Spinner项目选择时的背景颜色,但这样做只会改变所选TextView的背景颜色,而不会在下拉列表中改变其颜色,我想要在查看下拉列表时更改所选TextView的背景颜色。
我想要改变列表中所选项目的颜色,而不是Spinner的颜色,请参见下面的图片。 enter image description here 我该如何做?请问有人能帮帮我吗?
非常感谢您的帮助。

你需要实现它的 getDropDownView() 方法,如果做不到,请在这里发布你的代码。 - Vickyexpert
在Spinner的适配器中应用onclick,并为特定项设置新的背景颜色。 - Bhunnu Baba
@Vickyexpert:你能否给我一个想法,如何使用getDropDownView()方法来实现这个?这将是一个很大的帮助。非常感谢您的提前帮助。 - Prithniraj Nicyone
请给我展示你的适配器类,这样我就可以编辑它。 - Vickyexpert
@Vickyexpert:我正在使用简单的ArrayAdapter,没有对其进行任何自定义。 ArrayAdapter _adapter = new ArrayAdapter<>(context, R.layout.simple_text_view); _adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); _adapter.add("One"); _adapter.add("Two"); _adapter.add("Three"); _spinner.setAdapter(_adapter);请检查一下。 - Prithniraj Nicyone
6个回答

27
你需要在你的适配器类中实现以下方法:
它将会对你有所帮助:
 int selectedItem = -1;

 ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {

   @Override
   public View getDropDownView(int position, View convertView, ViewGroup parent)
   {
       View v = null;
       v = super.getDropDownView(position, null, parent);
       // If this is the selected item position
       if (position == selectedItem) {
           v.setBackgroundColor(Color.BLUE);
       }
       else {
           // for other views
           v.setBackgroundColor(Color.WHITE);

       }
       return v;
   }
};

 dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
 mySpinner.setAdapter(dataAdapter);

现在在Spinner中选择的项目放置在下方

   selectedItem = position;

1
谢谢您提供这段代码 :) 但是它只改变了下拉列表中第0个位置项目的背景颜色,而不是所选项目的背景颜色。我该如何做到这一点?并且在重写getDropDownView方法后,下拉菜单的图标也不可见。 - Prithniraj Nicyone
你需要传递 selectedItemPosition 而不是 0。 - Vickyexpert
1
这个可以运行,但这是老派的解决方案。我们能否使用ripple并配置样式来实现它? - Davideas
最后设置 @Override public void onItemSelected(AdapterView<?> parent, View view, final int position, long id) { selectedItem = position; } - Teekam
此解决方案仅适用于第一次给定的位置。它不会在每次选择下拉菜单项时更改颜色。 - Erum
显示剩余3条评论

2
以下是通过XML解决方案:
下拉选择框如下所示:
<Spinner
        android:id="@+id/settingsSleepingTimePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/spinner_main_button"
        android:popupBackground="@color/colorPrimary"
        android:textColor="@android:color/white"
        android:textSize="20sp"/>

在创建下拉框时,将setDropDownViewResource设置为自定义布局:

adapter.setDropDownViewResource(R.layout.spinner_item);

spinner_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="@drawable/spinner"
    android:textColor="#ffffff"
    android:textSize="20sp" /> 

最后,我们将@drawable/spinner设置如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/colorPrimaryLight" android:state_hovered="true" />
    <item android:drawable="@color/colorPrimaryLight" android:state_selected="true" />
</selector>

希望我的回答能够有所帮助!


0

我在互联网上搜索了一个适当的解决方案,以便在Java代码中不需要硬编码背景行为。

您可以使用可绘制对象来实现此目的(设置所选项目的背景颜色)。

您需要做的是将dropdownViewResource设置为自定义布局。该布局应该类似于以下内容:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/spinner_item_background"
    android:gravity="left"
    android:padding="8dp" />

spinner_item_background.xml 中,您可以为每个项目状态定义一个背景。例如,如果您想在按下时产生涟漪效果,但在选择时产生实心效果,您可以尝试以下方法:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Activated state is the selected item -->
    <item android:state_activated="true" android:drawable="#00ff00"/>
    <!-- Pressed state is the one the user is interacting with -->
    <item android:state_pressed="true" android:drawable="#00ff00"/>
    <!-- The rest of the items -->
    <item android:drawable="#ffffff"/>
</selector>

我已经尝试过这个,但状态没有起作用。我正在使用://ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this.getContext(), R.array.task_status, R.layout.spinner_item_when_closed); // adapter.setDropDownViewResource(R.layout.spinner_item_when_open); // 并在文件“res\layout\spinner_item_when_open.xml”中使用类似“spinner_item_background.xml”的代码设置背景 - educoutinho
我不知道这是否能解决问题,但是background-xml需要在drawable文件夹中。 - Ted de Koning
你不能将颜色代码传递给android:drawable,否则会出现以下错误:"与属性drawable(attr)引用不兼容"。 - Bhojaviya Sagar

0
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="colorControlNormal">@color/spinner_background</item>

</style>

在颜色文件夹中定义Spinner的背景颜色。


colorControlNormal 没有任何效果。 - Davideas

0
尝试在drawable中创建一个选择器,类似于以下内容:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@color/colorPrimary" />
<item android:drawable="@android:color/transparent" />
</selector>

将旋转器背景设置为

android:background="@drawable/spinner_selector"

这个更改不会影响背景,它会使右侧的小三角形消失... - Davideas

0
在您的Activity中创建一个int变量public static int posOfItemSpinnerSelected:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        posOfItemSpinnerSelected=position;
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
});

在你的适配器中插入以下代码

if(position== YourActivity.posOfItemSpinnerSelected){
    textView.setBackgroundColor(ContextCompat.getColor(mActivity,R.color.item_spinner_selected)); 
} else {
    textView.setBackgroundColor(ContextCompat.getColor(mActivity,R.color.white));
} 

My spinner


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