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?

Janchenko
źródło
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>
Klaus Balduino
źródło
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"
Janchenko
źródło
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>
kreker
źródło
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.

Manuel Escrig
źródło
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

Günay Gültekin
źródło
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.

Atul O Holic
źródło
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.

CoolMind
źródło
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>
Sam jest
źródło
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.

lilbyrdie
źródło
1
Na początku poszedłem tą drogą, ale kolor tekstu nie zmienił się z jakiegoś powodu.
yanchenko