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?


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>

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"

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>

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.


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


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 .


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.


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>

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.


1
Ich bin anfangs diesen Weg gegangen, aber die Textfarbe hat sich aus irgendeinem Grund nicht geändert.
Yanchenko
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.