Android: Nie wyświetla się textColor wyłączonego przycisku w selektorze?

98

Próbuję utworzyć przycisk z selektorem, mój przycisk może mieć następujące stany:

  • Włączony wyłączony
  • Wciśnięty / Nie wciśnięty

Według wyżej wymienionych stanów. Muszę manipulować przyciskami:

  • Kolor tekstu
  • zdjęcie w tle

Przycisk zaczyna być wyłączony, więc powinien mieć wyłączony textColor i wyłączone tło przycisku. Ale widzę domyślny textColor (określony w stylu) i NIE MA obrazu tła!

Oto mój selektor 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>

A oto moja deklaracja przycisku w pliku my 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" />

I wreszcie to jest mój styl (gdzie ustawiony jest mój domyślny textColor)

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

Proszę pomóż!

Nouran H.
źródło

Odpowiedzi:

251

Musisz także utworzyć ColorStateListdla tekstu kolory identyfikujące różne stany.

Wykonaj następujące czynności:

  1. Utwórz inny plik XML o res\colornazwie podobnej do 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. W swoim style.xml, umieść odniesienie do tego text_color.xmlpliku w następujący sposób:

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

To powinno rozwiązać problem.

Adil Soomro
źródło
1
czy nie musisz zapisywać swojego pliku text_color.xml w / res / drawable (zamiast / res / color), jeśli odwołujesz się do niego przez @ drawable / text_color?
Erwan
1
@ Erwan dzięki za korektę. w rzeczywistości, jeśli widzisz historię edycji, opublikowałem ją jako folder do rysowania, a jakiś miły facet zmodyfikował go do koloru, ale zapomniał zaktualizować go do @colorbuttyStyle. Teraz jest zaktualizowany.
Adil Soomro
5
text_color.xmlnie kompiluje się (przynajmniej dla mnie), chyba że umieszczę go w drawablefolderze, co wymaga @drawable/text_color
określania
@mickey tak, masz rację, więc jeśli widzisz historię edycji, początkowo sugerowano ją w wersji do rysowania, ale ktoś zaktualizował ją do folderu kolorów, teraz to poprawiłem.
Adil Soomro
1
@ D3LIC1OU5 Jeśli spojrzysz na komentarze, powiedziano, że oba sposoby działają. Właśnie przejrzałem dokumentację i colorjest to właściwy folder dla zasobu Color State List. Twoja edycja jest mile widziana.
Adil Soomro
7

1. utwórz folder kolorów w folderze / res / iw folderze kolorów utwórz w formacie 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. teraz utwórz układ 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"/>  
Bhaskar Kumar Singh
źródło
4

Najłatwiejszym rozwiązaniem jest ustawienie filtru kolorów na obraz tła przycisku i, tak jak widziałem tutaj

Możesz wykonać następujące czynności:

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

Mam nadzieję, że komuś pomogłem ...

Drzewiasty
źródło
Jest to dobry sposób na zrobienie tego dynamicznie, gdy nie masz wcześniej obrazu tła przycisku. Ale to nie dba o kolor tekstu.
Eran Goldin
-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" />

Nie widzę diable twojego przycisku w pliku XML układu. dodaj to do układu przycisków.

android:enabled="false"

więc układ przycisku będzie taki,

<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
źródło
@ Aqif Hamid Robię to programowo button.setEnabled (false) w mojej metodzie onCreat ()
Nouran H
-1

Możesz stworzyć listę kolorów

Lokalizacja pliku:

res/color/filename.xml

Nazwa pliku będzie używana jako identyfikator zasobu.

odniesienie do zasobu:

W Javie: R.color.filename

W XML: @[package:]color/filename

składnia:

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

Przykład:

Plik XML zapisany w 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>

Ten kod XML układu zastosuje listę kolorów do widoku:

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

Zobacz: Odniesienie do listy kolorów

Lal Krishna
źródło