【问题标题】:Change background color of the selected item in Android Spinner在 Android Spinner 中更改所选项目的背景颜色
【发布时间】:2016-12-03 21:26:09
【问题描述】:

我正在开发一个 Android 应用程序,并在我的应用程序的许多地方使用 Spinner。 我想要的是更改微调器所选项目的背景颜色,以便可以轻松识别当前选择的项目。

我已经检查了此链接Setting background color for Spinner Item on selection,但这样做会更改选定的 textview 背景颜色,但不会更改其在下拉列表中的颜色,我想在看到下拉列表时更改选定 textview 的背景颜色.

我想更改列表中所选项目的颜色,而不是在微调器上,请参见下图。

我怎样才能做到这一点?请问,有人可以帮我吗?

非常感谢。

【问题讨论】:

  • 您需要实现它的 getDropDownView() 方法,执行此操作,如果无法在此处发布您的代码
  • 在微调器的适配器中应用 onclick 并为特定项目设置新的背景颜色。
  • @Vickyexpert:你能告诉我如何使用 getDropDownView() 方法来实现这一点。这将是一个很大的帮助。非常感谢。
  • 显示你的适配器类以便我编辑它
  • @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);请检查一次。

标签: android spinner


【解决方案1】:

在你的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));
} 

【讨论】:

    【解决方案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>
    

    希望我的回答对你有帮助!

    【讨论】:

      【解决方案3】:

      我已经在互联网上搜索了一个合适的解决方案来做到这一点,而无需在 java 代码中硬编码背景行为。 您可以使用 drawables 来实现这一点(设置所选项目的背景颜色)。

      您需要做的是将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 适配器 = ArrayAdapter.createFromResource(this.getContext(), R.array.task_status, R.layout.spinner_item_when_closed); // adapter.setDropDownViewResource(R.layout.spinner_item_when_open); // 并使用类似“spinner_item_background.xml”的代码在文件“res\layout\spinner_item_when_open.xml”中设置背景
      • 不知道这样能不能解决问题,但是background-xml需要在drawable文件夹下。
      • 你不能将颜色代码传递给 android:drawable 它给出这个错误“与属性 drawable (attr) 参考不兼容”
      【解决方案4】:

      您需要在您的适配器类中实现以下方法:

      它会帮助你:

       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);
      

      现在在微调器中选择的项目放在下面

         selectedItem = position;
      

      【讨论】:

      • 感谢您提供此代码 :) 但这会更改第 0 个位置项目的背景颜色,而不是在微调器中选择的项目的背景颜色。我该怎么做,并且在覆盖 getDropDownView 方法后,下拉图标也不可见。
      • 你需要传入selectedItemPosition而不是0,
      • 这行得通,但它是老派的解决方案。我们可以用涟漪代替它并配置样式吗?
      • 最后设置@Override public void onItemSelected(AdapterView> parent, View view, final int position, long id) { selectedItem = position; }
      • 如果我想改变文字颜色我需要做什么?
      【解决方案5】:

      尝试在可绘制对象中创建一个选择器,例如,

      <?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"
      

      【讨论】:

      • 此更改对背景没有任何影响,它会使右侧的小三角形消失...
      【解决方案6】:
      <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_background 颜色..

      【讨论】:

      • colorControlNormal无效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      相关资源
      最近更新 更多