Android: цвет текста отключенной кнопки в селекторе не отображается?

98

Я пытаюсь создать кнопку с помощью селектора, моя кнопка может иметь следующие состояния:

  • Включено выключено
  • Нажат / не отжат

По состояниям, упомянутым выше. Мне нужно манипулировать кнопкой:

  • Цвет текста
  • изображение на заднем плане

Кнопка начинается с того, что я отключен, поэтому у нее должен быть отключенный textColor и отключенный фон кнопки. Но я вижу текстовый цвет по умолчанию (указанный в стиле) и НЕТ фонового изображения!

Вот мой селектор button_selector.xml

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

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

    <item android:state_pressed="false"
        android:state_enabled="false"
        android:textColor="#9D9FA2"
        android:drawable="@drawable/button" />    

    <item android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/button_pressed"/>

    <item android:state_pressed="true"
        android:state_enabled="false"
        android:textColor="#9D9FA2"
        android:drawable="@drawable/button"/>

    <item android:state_pressed="false"
        android:state_enabled="true"
        android:drawable="@drawable/button"/>    

</selector>

А вот объявление моей кнопки в моем layout.xml

    <Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

И, наконец, это мой стиль (где установлен текстовый цвет по умолчанию)

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

 <resources>

     <style name="buttonStyle">
      <item name="android:textStyle">bold</item>
      <item name="android:textColor">#282780</item>
      <item name="android:textSize">18sp</item>
     </style>

</resources>

Пожалуйста помоги!

Нуран Х
источник

Ответы:

251

Вам также необходимо создать ColorStateListцвет текста, определяющий различные состояния.

Сделайте следующее:

  1. Создайте еще один XML-файл с res\colorименем вроде text_color.xml.

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
      <!-- disabled state -->
      <item android:state_enabled="false" android:color="#9D9FA2" /> 
      <item android:color="#000"/>
    </selector>
  2. В вашем укажите style.xmlссылку на этот text_color.xmlфайл следующим образом:

    <style name="buttonStyle" parent="@android:style/Widget.Button">
      <item name="android:textStyle">bold</item>
      <item name="android:textColor">@color/text_color</item>
      <item name="android:textSize">18sp</item>
    </style>

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

Адиль Соомро
источник
1
разве вам не нужно сохранять файл text_color.xml в / res / drawable (а не в / res / color), если вы ссылаетесь на него с помощью @ drawable / text_color?
Эрван
1
@Erwan спасибо за исправление. на самом деле, если вы видите историю редактирования, я разместил ее как папку с возможностью переноса, и какой-то хороший парень отредактировал ее в цвет, но забыл обновить ее @colorв buttyStyle. Теперь его обновили.
Адиль Соомро
5
text_color.xmlне компилируется (для меня, по крайней мере), если я не drawable@drawable/text_color
помещаю
@mickey да, вы правы, поэтому, если вы видите историю редактирования, она изначально была предложена в режиме рисования, но кто-то обновил ее в папке цвета, теперь я исправил ее.
Адиль Соомро,
1
@ D3LIC1OU5, если вы посмотрите на комментарии, оба способа работают. Я только что проконсультировался с документацией и colorэто правильная папка для ресурса списка состояний цвета. Ваше редактирование приветствуется.
Адиль Соомро,
7

1. Создайте папку цветов в папке / res / и в папке цветов создайте в xml:

text_color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- disabled state --> 
<item android:state_enabled="false" android:color="#776678" /> 
 <item android:color="#ffffff"/>
</selector>

2.Теперь создайте макет xml: -

 <Button

        android:id="@+id/button_search"

        android:layout_width="652dp"

        android:layout_height="48dp"

        android:layout_alignParentLeft="true"

        android:layout_alignParentTop="true"

        android:layout_marginTop="18dp"

        android:background="@android:color/transparent"

        android:text="Hello Bhaskar"

        android:textColor="@color/text_color_selector"/>  
Бхаскар Кумар Сингх
источник
4

Самое простое решение - установить цветовой фильтр для фонового изображения и кнопки, как я видел здесь.

Вы можете сделать следующее:

if ('need to set button disable')
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);

Надеюсь, я кому-то помог ...

Вуди
источник
Это хороший способ сделать это динамически, когда у вас заранее нет фонового изображения кнопки. Но это не касается цвета текста.
Эран Голдин
-1
<Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

Я не вижу нажатия вашей кнопки в вашем макете xml. добавьте это в макет вашей кнопки.

android:enabled="false"

так что ваш макет кнопки будет,

<Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:enabled="false"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />
Акиф Хамид
источник
@ Aqif Hamid Я делаю это программно button.setEnabled (false) в моем методе onCreat ()
Nouran H
-1

Вы можете создать список цветов

расположение файла:

res/color/filename.xml

Имя файла будет использоваться как идентификатор ресурса.

ссылка на ресурс:

В Java: R.color.filename

В XML: @[package:]color/filename

синтаксис:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>

Пример:

Файл XML сохранен по адресу res/color/button_text.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:color="#ffff0000"/> <!-- pressed -->
    <item android:state_focused="true"
          android:color="#ff0000ff"/> <!-- focused -->
    <item android:color="#ff000000"/> <!-- default -->
</selector>

Этот XML-код макета применит список цветов к представлению:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/button_text"
    android:textColor="@color/button_text" />

См .: Справочник по списку цветов

Лал Кришна
источник