2009-08-02 15 views
156

Chcę, aby prosty TextView zachowywał się tak, jak to robił simple_list_item_1 w ListView. Oto kod XML:Wybieracz Androida i kolor tekstu

<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ę go zmienić na textAppearanceLargeInverse?

+0

Jeśli ktoś szuka pliku xml, to jest tutaj: http://developer.android.com/resources/samples/Home/res/color/bright_text_dark_focused.html – swinefeaster

Odpowiedz

69

Również selektor to odpowiedź.

Szukaj bright_text_dark_focused.xml w źródłach, dodać do projektu pod res katalogu/kolor, a następnie odwołać się od TextView jak

android:textColor="@color/bright_text_dark_focused" 
+4

Myślę, że zmieniło się to na "primary_text_dark_focused.xml". – greg7gkb

+10

Po prostu rozwaliłem mój umysł. Przez cały czas zajmowałem się obsługą słuchaczy, aby zmienić kolor tekstu. Szczęka na podłodze. Znakomity! –

+0

Dzięki! Właśnie tego szukałem! – Zzokk

0

Czy próbowałeś już setOnFocusChangeListener? W ramach programu obsługi można 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(); 
     } 
    } 
}); 

Można wtedy zastosować cokolwiek zmienia się chce i kiedy to koncentruje się czy nie. Możesz także użyć ViewTreeObserver, aby słuchać zmian globalnych fokusów.

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 pomoże i daje pomysły.

+1

Poszedłem tę drogę początkowo, ale tekst kolor nie zmienił się z jakiegoś powodu. – yanchenko

351

mam wykonując kilka testów, aż jeden pracował, 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> 
+7

bez androida: możliwość przeciągnięcia aplikacja zawiesza się z tym selektorem xml – neufuture

+4

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

+1

Istnieje dokument opisujący listy stanów kolorów: http: // developer.android.com/guide/topics/resources/color-list-resource.html – Rick77

26

Oto mój wdrażania, który zachowuje się dokładnie tak, 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/kolor/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> 
+0

To działało dobrze dla mnie, aw moim przypadku działało całkiem dobrze dla dostosowania podświetlonych/nieoznaczonych kolorów dla mojej implementacji TabHost – oddmeter

3

Oto przykład selektora. Jeśli używasz zaćmienia, nie sugeruje coś po kliknięciu CTRL i spacji zarówno:/musisz go 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 zajrzeć do odniesienia;

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

2

zawsze stosować powyższe rozwiązanie bez poszukiwania bardziej po tym. ;-)

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

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

Jest również bardzo dobrze udokumentowane, here.

1

przypadku korzystania TextView w zakładkach ta definicja selektor pracował dla mnie (próbował Klaus Balduíno tych, ale tak się nie stał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> 
17

Aby pracować w sprawie wyboru w widoku listy użyć 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.

+6

Nie zapomnij umieścić tego pliku w res/kolor teczka –