Selektor Androida i kolor tekstu


184

Chcę, aby prosty TextViewzachowywał się tak, simple_list_item_1jak ListViewrobi. Oto XML:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content" android:layout_width="fill_parent"
    android:gravity="center" android:focusable="true"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:background="@android:drawable/list_selector_background" />

Wszystko działa z wyjątkiem koloru tekstu, który (prawdopodobnie) nie zmienia się w stanie skupienia. Jak mogę to zmienić na textAppearanceLargeInverse?


Jeśli ktoś szuka pliku xml, jest on tutaj: developer.android.com/resources/samples/Home/res/color/…
swinefeaster

Odpowiedzi:


403

Wykonałem kilka testów, aż jeden zadziałał, więc: res / color / button_dark_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="#000000" /> <!-- pressed -->
     <item android:state_focused="true"
           android:color="#000000" /> <!-- focused -->
     <item android:color="#FFFFFF" /> <!-- default -->
 </selector>

res / layout / view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="EXIT"
       android:textColor="@color/button_dark_text" />
</LinearLayout>

8
bez Androida: aplikacja do rysowania ulega awarii przy użyciu tego selektora xml
neufuture

4
@neufuture: musisz użyćandroid:textColor="@color/button_dark_text"
Paul

3
Istnieje dokument opisujący listy stanów kolorów: developer.android.com/guide/topics/resources/…
Rick77

Jako ciekawostka działa również, gdy tekst, przycisk lub dowolny element został aktywowany, np. Dla elementu listy. <pozycja android: state_activated = "true" android: color = "@ android: color / white" />
jiahao

Czy selektor powinien naprawdę znajdować się w res/colorfolderze?
mr5

79

A selektor jest tutaj również odpowiedzią.

Wyszukaj bright_text_dark_focused.xml w źródłach, dodaj do projektu w katalogu res / color, a następnie odwołaj się z TextView jako

android:textColor="@color/bright_text_dark_focused"

5
Myślę, że zmieniło się to na „primary_text_dark_focused.xml”.
greg7gkb

11
To po prostu oszalało. Przez cały czas zajmowałem się rzeczami ze słuchaczami, aby zmienić kolor tekstu. Szczęka na podłodze. Znakomity!
Artem Russakovskii

Nigdy nie myślałem, że selektory działają również dla textColor, super łatwe.
Drejc

Próbowałem tego z głównym układem widoku, który stworzyłem dla siebie ListFragment, i skończyłem z wieloma błędami . Co ja robię źle?
MowDownJoe

nie możemy użyć @android: kolor / biały tam .. wyświetlanie pomocy treści niedostępne po naciśnięciu Ctrl + spacja
LOG_TAG

31

Oto moja implementacja, która zachowuje się dokładnie jak pozycja na liście (przynajmniej 2.3)

res / layout / list_video_footer.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/list_video_footer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@android:drawable/list_selector_background"
        android:clickable="true"
        android:gravity="center"
        android:minHeight="98px"
        android:text="@string/more"
        android:textColor="@color/bright_text_dark_focused"
        android:textSize="18dp"
        android:textStyle="bold" />

</FrameLayout>

res / color / bright_text_dark_focused.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true" android:color="#444"/>
    <item android:state_focused="true" android:color="#444"/>
    <item android:state_pressed="true" android:color="#444"/>
    <item android:color="#ccc"/>

</selector>

Działa to dla mnie dobrze, aw moim przypadku działało całkiem dobrze, dostosowując podświetlone / niepodświetlone kolory dla mojej implementacji
TabHost

27

Aby działał na zaznaczeniu w widoku listy, użyj następującego kodu:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#fff"/>
    <item android:state_activated="true" android:color="#fff"/>
    <item android:color="#000" />
</selector>

Najwyraźniej kluczem jest state_activated="true"stan.


17
Nie zapomnij umieścić tego pliku w folderze res / color
Nguyen Minh Binh

4

Oto przykład selektora. Jeśli używasz Eclipse, nie sugeruje to czegoś po kliknięciu Ctrl i spacji: / musisz to wpisać.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_default_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/btn_default_selected"
    android:state_focused="true"
    android:state_enabled="true"
    android:state_window_focused="true"  />
<item android:drawable="@drawable/btn_default_normal" />

Możesz poszukać odniesienia;

http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList


2

Zawsze korzystałem z powyższego rozwiązania, nie szukając więcej po tym. ;-)

Jednak dzisiaj natknąłem się na coś i pomyślałem o tym. :)

Ta funkcja jest rzeczywiście dostępna z interfejsu API 1 i nazywa się jako ColorStateList , gdzie możemy dostarczyć kolor do różnych stanów widżetów (jak już wiemy).

Jest to również bardzo dobrze udokumentowane tutaj.


2

W res/colormiejscu plik „text_selector.xml”:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/blue" android:state_focused="true" />
    <item android:color="@color/blue" android:state_selected="true" />
    <item android:color="@color/green" />
</selector>

Następnie w TextViewużyciu:

<TextView
    android:id="@+id/value_1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Text"
    android:textColor="@color/text_selector"
    android:textSize="15sp"
    />

W kodzie musisz ustawić detektor kliknięć.

private var isPressed = false

private fun TextView.setListener() {
    this.setOnClickListener { v ->
        run {
            if (isPressed) {
                v.isSelected = false
                v.clearFocus()
            } else {
                v.isSelected = true
                v.requestFocus()
            }
            isPressed = !isPressed
        }
    }
}

override fun onResume() {
    super.onResume()
    textView.setListener()
}

override fun onPause() {
    textView.setOnClickListener(null)
    super.onPause()
}

Przepraszamy, jeśli występują błędy, zmieniłem kod przed opublikowaniem i nie sprawdziłem.


1

Jeśli korzystam z TextView w kartach, ta definicja selektora działała dla mnie (wypróbowałem Klausa Balduino, ale nie zadziałało):

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <!--  Active tab -->
  <item
    android:state_selected="true"
    android:state_focused="false"
    android:state_pressed="false"
    android:color="#000000" />

  <!--  Inactive tab -->
  <item
    android:state_selected="false"
    android:state_focused="false"
    android:state_pressed="false"
    android:color="#FFFFFF" />

</selector>

0

Próbowałeś setOnFocusChangeListener? W module obsługi możesz zmienić wygląd tekstu.

Na przykład:

TextView text = (TextView)findViewById(R.id.text);
text.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            ((TextView)v).setXXXX();
        } else {
            ((TextView)v).setXXXX();
        }
    }
});

Następnie możesz zastosować dowolne zmiany, gdy są skoncentrowane lub nie. Możesz także użyć ViewTreeObserver do nasłuchiwania zmian globalnego fokusa.

Na przykład:

View all = findViewById(R.id.id_of_top_level_view_on_layout);
ViewTreeObserver vto = all.getViewTreeObserver();
vto.addOnGlobalFocusChangeListener(new ViewTreeObserver.OnGlobalFocusChangeListener() {
    public void onGlobalFocusChanged(
        View oldFocus, View newFocus) {
        // xxxx
    }
});

Mam nadzieję, że to pomaga lub daje ci pomysły.


1
Na początku poszedłem tą drogą, ale kolor tekstu nie zmienił się z jakiegoś powodu.
yanchenko
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.