Android-Auswahl & Textfarbe

183

Ich möchte TextView, dass sich simple_list_item_1ein ListViewMensch einfach so verhält, wie er es tut. Hier ist das 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" />

Alles funktioniert bis auf die Textfarbe, die sich (erwartungsgemäß) im fokussierten Zustand nicht ändert. Wie ändere ich es textAppearanceLargeInverse?

yanchenko
quelle
Falls jemand nach der XML-Datei sucht, ist sie hier: developer.android.com/resources/samples/Home/res/color/…
swinefeaster

Antworten:

401

Ich habe mehrere Tests durchgeführt, bis einer funktioniert hat, also: 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
quelle
8
ohne android: drawable stürzt die app mit diesem selector xml ab
neufuture
4
@neufuture: Sie müssen verwendenandroid:textColor="@color/button_dark_text"
Paul
3
Es gibt ein Dokument, das die
Farbstatuslisten
Aus Neugier funktioniert es auch, wenn der Text, die Schaltfläche oder ein Element aktiviert wurde, z. B. für ein Listenelement. <item android: state_activated = "true" android: color = "@ android: color / white" />
jiahao
Sollte sich der Selektor wirklich unter dem res/colorOrdner befinden?
mr5
79

Und Selektor ist auch hier die Antwort.

Suchen Sie in den Quellen nach bright_text_dark_focused.xml, fügen Sie es Ihrem Projekt im Verzeichnis res / color hinzu und verweisen Sie dann in der Textansicht auf

android:textColor="@color/bright_text_dark_focused"
yanchenko
quelle
5
Ich denke, dies hat sich in "primary_text_dark_focused.xml" geändert.
Greg7gkb
11
Das hat mich einfach umgehauen. Ich habe die ganze Zeit mit Zuhörern gearbeitet, um die Textfarbe zu ändern. Kiefer auf dem Boden. Brillant!
Artem Russakovskii
Ich hätte nie gedacht, dass Selektoren auch für textColor funktionieren, super einfach.
Drejc
Ich habe dies mit dem Stammlayout einer Ansicht versucht, die ich für meine erstellt habe ListFragment, und am Ende eine Reihe von Fehlern festgestellt . Was mache ich falsch?
MowDownJoe
Wir können @android: color / white dort nicht verwenden. Die Anzeige der Inhaltsunterstützung ist nicht verfügbar, wenn ich Strg +
Leertaste drücke
31

Hier ist meine Implementierung, die sich genau wie ein Element in der Liste verhält (zumindest in 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
quelle
Dies funktionierte gut für mich und in meinem Fall ziemlich gut für das Anpassen der hervorgehobenen / nicht hervorgehobenen Farben für meine TabHost-Implementierung
Oddmeter
27

Verwenden Sie den folgenden Code, damit die Auswahl in einer Listenansicht funktioniert:

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

Anscheinend ist der Schlüssel state_activated="true"Zustand.

Manuel Escrig
quelle
17
Vergessen Sie nicht, diese Datei im Ordner res / color abzulegen
Nguyen Minh Binh
4

Hier ist das Beispiel eines Selektors. Wenn Sie Eclipse verwenden, schlägt dies nichts vor, wenn Sie auf Strg und Leerzeichen klicken: / Sie müssen es eingeben.

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

Sie können als Referenz suchen;

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

Günay Gültekin
quelle
2

Ich habe immer die obige Lösung verwendet, ohne danach mehr zu suchen. ;-);

Heute bin ich jedoch auf etwas gestoßen und habe darüber nachgedacht, es zu teilen. :) :)

Diese Funktion ist in der Tat über API 1 verfügbar und wird als ColorStateList bezeichnet , wo wir verschiedenen Widgets-Zuständen (wie wir bereits wissen) eine Farbe zuweisen können.

Es ist hier auch sehr gut dokumentiert .

Atul O Holic
quelle
2

In res/colorOrt eine Datei „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>

Dann TextViewbenutze es:

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

Und im Code müssen Sie einen Klick-Listener festlegen.

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

Entschuldigung, wenn es Fehler gibt, habe ich vor der Veröffentlichung einen Code geändert und nicht überprüft.

CoolMind
quelle
1

Wenn Sie TextViews in Registerkarten verwenden, hat diese Auswahldefinition für mich funktioniert (habe Klaus Balduino ausprobiert, aber nicht):

<?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 ist
quelle
0

Hast du es versucht setOnFocusChangeListener? Innerhalb des Handlers können Sie das Erscheinungsbild des Textes ändern.

Zum Beispiel:

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

Sie können dann beliebige Änderungen anwenden, wenn sie fokussiert sind oder nicht. Sie können den ViewTreeObserver auch verwenden, um auf globale Fokusänderungen zu warten.

Zum Beispiel:

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

Ich hoffe das hilft oder gibt dir Ideen.

lilbyrdie
quelle
1
Ich bin anfangs diesen Weg gegangen, aber die Textfarbe hat sich aus irgendeinem Grund nicht geändert.
Yanchenko