Android: текст кольору відключеної кнопки у селекторі не відображається?


98

Я намагаюся зробити кнопку за допомогою селектора, моя кнопка може мати наступні стани:

  • Увімкнено / Вимкнено
  • Пресований / Непресований

Відповідно до згаданих вище держав. Мені потрібно маніпулювати кнопками:

  • Колір тексту
  • фонове зображення

Кнопка починається з мого відключення, тому вона повинна мати відключений textColor та фон відключеної кнопки. Але я бачу за замовчуванням 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 дякую за виправлення. насправді, якщо ви бачите історію редагування, я опублікував її як папку для малювання, а якийсь симпатичний хлопець відредагував її до кольору, але забув оновити до @colorbuttyStyle. Зараз його оновлено.
Аділ Сумро,

4
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" />

Посилання: Довідник списку кольорів

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.