Selettore Android e colore del testo


184

Voglio una semplice TextViewcomportarsi il modo simple_list_item_1in una ListViewfa. Ecco l'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" />

Tutto funziona tranne il colore del testo che (prevedibilmente) non cambia nello stato attivo. Come faccio a cambiarlo in textAppearanceLargeInverse?


Nel caso in cui qualcuno stia cercando il file xml, è qui: developer.android.com/resources/samples/Home/res/color/…
swinefeaster

Risposte:


404

Ho fatto diversi test fino a quando uno ha funzionato, quindi: 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
senza Android: l'app
estraibile si arresta in modo anomalo

4
@neufuture: devi usareandroid:textColor="@color/button_dark_text"
Paul

3
C'è un documento che descrive gli elenchi degli stati dei colori: developer.android.com/guide/topics/resources/…
Rick77,

Come curiosità, funziona anche quando il testo, il pulsante o qualsiasi elemento è stato attivato, ad esempio, per l'elemento dell'elenco. <item android: state_activated = "true" android: color = "@ android: color / white" />
jiahao

Il selettore dovrebbe davvero risiedere nella res/colorcartella?
5

79

E il selettore è la risposta anche qui.

Cerca bright_text_dark_focused.xml nei sorgenti, aggiungi al tuo progetto nella directory res / color e quindi fai riferimento a TextView come

android:textColor="@color/bright_text_dark_focused"

5
Penso che questo sia cambiato in "primary_text_dark_focused.xml".
greg7gkb,

11
Questo mi ha fatto impazzire. Ho gestito le cose con gli ascoltatori per cambiare il colore del testo per tutto questo tempo. Mascella sul pavimento. Brillante!
Artem Russakovskii,

Non avrei mai pensato che i selettori funzionassero anche per textColor, super facile.
Drejc,

Ho provato questo con il layout di root di una vista che ho creato per me ListFragmente ho finito con un mucchio di errori . Che cosa sto facendo di sbagliato?
MowDownJoe

non possiamo usare @android: colore / bianco laggiù .. visualizzazione dell'assistenza ai contenuti non disponibile quando premo Ctrl + spazio
LOG_TAG

31

Ecco la mia implementazione, che si comporta esattamente come elemento nell'elenco (almeno su 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 / colore / 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>

Questo ha funzionato bene per me, e nel mio caso ha funzionato abbastanza bene per regolare i colori evidenziati / non evidenziati per la mia implementazione
TabHost

27

Per farlo funzionare sulla selezione in una vista elenco utilizzare il seguente codice:

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

Apparentemente la chiave è lo state_activated="true"stato.


17
Non dimenticare di posizionare questo file nella cartella res / color
Nguyen Minh Binh

4

Ecco l'esempio di selettore. Se si utilizza eclipse, non suggerisce qualcosa quando si fa clic su Ctrl e si spazio entrambi: / è necessario digitare.

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

Puoi guardare come riferimento;

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


2

Ho sempre usato la soluzione sopra senza cercare altro dopo questo. ;-)

Tuttavia, oggi mi sono imbattuto in qualcosa e ho pensato di condividerlo. :)

Questa funzione è effettivamente disponibile dall'API 1 e si chiama ColorStateList , dove possiamo fornire un colore a vari stati di Widget (come già sappiamo).

È anche molto ben documentato, qui.


2

Al res/colorposto di un file "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>

Quindi in TextViewuso:

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

E nel codice dovrai impostare un listener di clic.

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()
}

Scusate se ci sono errori, ho cambiato un codice prima della pubblicazione e non ho controllato.


1

Se usando TextViews nelle schede questa definizione di selettore ha funzionato per me (ho provato Klaus Balduino ma non l'ha fatto):

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

Ci hai provato setOnFocusChangeListener? All'interno del gestore, è possibile modificare l'aspetto del testo.

Per esempio:

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();
        }
    }
});

È quindi possibile applicare tutte le modifiche desiderate quando è focalizzato o meno. È inoltre possibile utilizzare ViewTreeObserver per ascoltare le modifiche al focus globale.

Per esempio:

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
    }
});

Spero che questo ti aiuti o ti dia idee.


1
Inizialmente sono andato così, ma per qualche motivo il colore del testo non è cambiato.
yanchenko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.