在android中更改微调器上小三角形的颜色

Posted

技术标签:

【中文标题】在android中更改微调器上小三角形的颜色【英文标题】:Change colour of small triangle on spinner in android 【发布时间】:2014-11-12 17:06:12 【问题描述】:

如何更改微调器右下角小三角形的颜色,如图所示? 它现在显示默认的灰色。像这样

【问题讨论】:

根据要求为其添加自定义背景。 图像中只有一个小三角形? sdk中一定有灰色的图片。您能否提供它的链接,以便我可以复制粘贴它并仅更改其颜色。 希望对您有所帮助...gersic.com/blog.php?id=57 @Ricky 这是一篇很好的文章,非常清楚地解释了这个过程。我已将其包含在答案的底部,感谢您。 【参考方案1】:

最好和最简单的解决方案:

spinner.getBackground().setColorFilter(getResources().getColor(R.color.red), PorterDuff.Mode.SRC_ATOP);

如果您不想更改所有 Spinner,其他解决方案(感谢 Simon):

Drawable spinnerDrawable = spinner.getBackground().getConstantState().newDrawable();

spinnerDrawable.setColorFilter(getResources().getColor(R.color.red), PorterDuff.Mode.SRC_ATOP);

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) 
    spinner.setBackground(spinnerDrawable);
else
    spinner.setBackgroundDrawable(spinnerDrawable);

【讨论】:

不太好,这会改变所有微调器的颜色。 要将其仅应用于特定微调器,您必须复制可绘制对象: Drawable spinnerDrawable = spinner.getBackground().getConstantState().newDrawable(); spinnerDrawable.setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP); if (Build.VERSION.SDK_INT >= 16) spinner.setBackground(spinnerDrawable); ***.com/a/7980637/976686 对我来说,它改变所有微调器的颜色是不正确的 这里相同 @4ndro1d 。也许这与您运行它的 SDK 级别有关。我正在 6.0.1 上进行测试。【参考方案2】:

Lollipop开始,你可以在xml上设置背景色调,

android:backgroundTint="@color/my_color"

【讨论】:

请不要只在您没有为微调器设置背景时才有效【参考方案3】:

要获得正确的图像,您可以访问Android Asset Studio 站点并选择Android Holo Colors Generator。这将创建您可能需要的所有资产,包括“三角形”。它还生成实现更改的 XML 文件。


以下是示例 XML 文件:

自定义颜色:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="apptheme_color">#33b5e5</color>
</resources>

自定义微调器样式:

<?xml version="1.0" encoding="utf-8"?>

<!-- Generated with http://android-holo-colors.com -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">

  <style name="SpinnerAppTheme" parent="android:Widget.Spinner">
      <item name="android:background">@drawable/apptheme_spinner_background_holo_light</item>
      <item name="android:dropDownSelector">@drawable/apptheme_list_selector_holo_light</item>
  </style>

  <style name="SpinnerDropDownItemAppTheme" parent="android:Widget.DropDownItem.Spinner">
      <item name="android:checkMark">@drawable/apptheme_btn_radio_holo_light</item>
  </style>
</resources>

自定义应用程序主题:

<?xml version="1.0" encoding="utf-8"?>

<!-- Generated with http://android-holo-colors.com -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">

  <style name="AppTheme" parent="@style/_AppTheme"/>

  <style name="_AppTheme" parent="Theme.AppCompat.Light">

    <item name="android:spinnerStyle">@style/SpinnerAppTheme</item>

    <item name="android:spinnerDropDownItemStyle">@style/SpinnerDropDownItemAppTheme</item>

  </style>

</resources>

如您所见,这些样式还引用了许多可绘制对象。

这是您要更改的“三角形”特有的一个:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false"
          android:drawable="@drawable/apptheme_spinner_disabled_holo_light" />
    <item android:state_pressed="true"
          android:drawable="@drawable/apptheme_spinner_pressed_holo_light" />
    <item android:state_pressed="false" android:state_focused="true"
          android:drawable="@drawable/apptheme_spinner_focused_holo_light" />
    <item android:drawable="@drawable/apptheme_spinner_default_holo_light" />
</selector>

我认为这里不是完整列出每个文件的正确位置,因为您可以直接从引用的工具中获取所有文件。


注意:这是为整个应用设置主题的方式,以便所有微调器都更新为自定义样式。

如果您正在寻找一种快速而肮脏的方法来仅更改一个微调器,请查看 Ricky 在他的评论中引用的那篇文章:

Android: Custom Spinners by Tom Gersic

我还是建议你阅读它,因为它很好地解释了这个过程,并且会帮助你理解我的其余答案。

【讨论】:

Tom Gersic 的文章链接已失效。我想我在这里找到了它的副本:synchronoussoft.net/blog/tom-gersic 什么是apptheme_spinner_background_holo_light【参考方案4】:

我在 Android 开发方面还是个新手,所以也许可以接受我的建议,但这里的答案似乎都与我使用的微调器实现无关。

我在寻找什么

android:backgroundTint="@color/colorPrimary"

这是整个&lt;Spinner&gt; 标签:

        <Spinner
            android:id="@+id/coin_selector"
            android:layout_
            android:layout_
            android:layout_margin="26dp"
            android:layout_weight="1"
            android:textColor="#FFFFFF"
            android:dropDownSelector="@color/colorAccent"
            android:backgroundTint="@color/colorPrimary"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            tools:layout_editor_absoluteY="89dp"/>

【讨论】:

android:backgroundTint 需要 API 级别 21【参考方案5】:

这也是以编程方式解决该问题的其他方法。 (在 API 19 及更高版本上测试)。

为此使用ViewCompat

ViewCompat.setBackgroundTintList(spinner, ColorStateList.valueOf(your_color));

使用spinner.setSupportBackgroundTintList 会引发错误

【讨论】:

优秀 - 这对我来说适用于常规 Spinner,不需要 AppCompatSpinner。好答案【参考方案6】:

就这样吧。这将帮助您解决问题。

<RelativeLayout 
     android:layout_
     android:layout_
     android:background="spinner background image">

        <Spinner       
        android:layout_
        android:layout_        
        android:background="@null"/>

        <ImageView 
         android:layout_
        android:layout_
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:src="arrow image" />

    </RelativeLayout>

刚刚查看了我为另一个查询给出的答案: Custom Spinner

【讨论】:

【参考方案7】:

如果你有minSdkVersion 21,那很简单:

<Spinner
style="@style/Widget.AppCompat.DropDownItem.Spinner"
android:layout_
android:layout_
android:backgroundTint="@color/triangleColor" />

其中 triangleColor 是您的颜色。

【讨论】:

【参考方案8】:

最低 SDK 版本 14 的解决方案。您可以使用支持库中的 AppCompatSpinner:

AppCompatSpinner spinner = (AppCompatSpinner) view.findViewById(R.id.my_spinner);
spinner.setSupportBackgroundTintList(ContextCompat.getColorStateList(context, R.color.my_color));

【讨论】:

以上是关于在android中更改微调器上小三角形的颜色的主要内容,如果未能解决你的问题,请参考以下文章

Android SQLite 在选定的微调器上显示特定行

Android微调器下拉菜单背景颜色更改

之字形页脚更改三角形颜色

如何在微调器中更改单选按钮颜色

如何更改TreeViewItem上三角形图标的颜色/不透明度?

如何更改微调器文本大小和文本颜色?