Изменение цвета маленького треугольника на spinner в android

enter image description here

Как я могу изменить цвет маленького треугольника в правом нижнем углу spinner, как показано на рисунке? Он показывает серый цвет по умолчанию прямо сейчас. такой

enter image description here

8 ответов


чтобы получить правильные изображения, вы можете перейти к Android Asset Studio сайт и выбрать Генератор Цветов Android Holo. Это создаст все активы, которые вам могут понадобиться, включая "треугольник". Он также генерирует XML-файлы, которые реализуют изменения.


вот пример XML-файлов:

Изготовленный На Заказ Цвет:

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

Пользовательский Стиль Spinner:

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

Я не думаю, что это правильное место для полного списка всех файлов, так как вы можете получить их все непосредственно из упомянутого инструмента.


Примечание: это способ темы всего приложения, так что все блесны обновляются до пользовательские стили.

если вы ищете быстрый и грязный способ изменить только один счетчик, а затем проверить эту статью, на которую ссылается Рикки в своем комментарии:

Я рекомендую прочитать его в любом случае, потому что он объясняет процесс очень хорошо, и поможет вам понять остальную часть моего ответа.


самое лучшее и самое простое решение:

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

другое решение (Спасибо Саймону), если вы не хотите менять все блесны:

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

С чупа-чупс on, вы можете установить фоновый оттенок на xml,

android:backgroundTint="@color/my_color"

просто сделайте так. Это поможет вам решить вашу проблему.

<RelativeLayout 
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:background="spinner background image">

        <Spinner       
        android:layout_width="match_parent"
        android:layout_height="match_parent"        
        android:background="@null"/>

        <ImageView 
         android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:src="arrow image" />

    </RelativeLayout>

или

просто посмотрел на ответ, который я дал для другого запроса: Пользовательский Spinner


решение для минимальной версии SDK 14. Вы можете использовать AppCompatSpinner из библиотеки поддержки:

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

Я все еще очень новичок в разработке Android, поэтому, возможно, примите мой совет с солью, но ни один из ответов здесь, похоже, не связан с реализацией spinner, которую я использовал.

то, что я искал

android:backgroundTint="@color/colorPrimary"

вот и все <Spinner> tag:

        <Spinner
            android:id="@+id/coin_selector"
            android:layout_width="wrap_content"
            android:layout_height="21dp"
            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"/>

Blue triangle


Если у вас есть minSdkVersion 21, это очень просто:

<Spinner
style="@style/Widget.AppCompat.DropDownItem.Spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/triangleColor" />

где triangleColor - ваш цвет.


вот другой способ решить эту проблему программно. (Протестировано на API 19 и выше).

использовать ViewCompat для этого.

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

использование spinner.setSupportBackgroundTintList выдает ошибку