2013-04-11 32 views
6

Tworzę SpinnerAdapter pomocą wbudowanego zasobów ID android.R.layout.simple_spinner_dropdown_itemJak mogę zmienić kolor textView android.R.layout.simple_spinner_dropdown_item?

SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_dropdown_item); 

ale TextView którym identyfikator zasobów tworzy textColor ma czarne i muszę inny kolor. Jaki jest najlepszy sposób na zmianę koloru, ale zachowując wszystko inne?

Kiedy próbuję utworzyć własny zasób układu textView w pliku xml, np.

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textColor="@color/White" 
    /> 

to nie zachowuje się w taki sam sposób, jak na przykład z powodu android.R.layout.simple_spinner_dropdown_item dopełnienie jest inne. Tak więc

  1. Czy istnieje sposób na stworzenie mojego własnego zasobu układu w pliku xml, który dziedziczy wszystko od android.R.layout.simple_spinner_dropdown_item i pozwala mi zastąpić textColor?
  2. Czy jest też dostępna pełna definicja elementu android.R.layout.simple_spinner_dropdown_item?
  3. A może jest jeszcze łatwiejszy sposób?

To pytanie dotyczy innego pytania, które zadałem dzisiaj (Can't change the text color with Android Action Bar drop-down navigation). Zdałem sobie sprawę, że jedną odpowiedzią na to pytanie (a więc i to pytanie) jest stworzenie mojej własnej klasy ArrayAdapter, która dziedziczy po ArrayAdapter<T>, dzięki czemu zawsze mogę ustawić kolor w kodzie, gdy ArrayAdapter zostanie użyty (zobacz moją odpowiedź na to pytanie) . Ale wydaje się to bardzo uciążliwym rozwiązaniem: - |.

Zmiana koloru tekstu nie powinna być trudnym zadaniem!

Odpowiedz

8

Is there a way of creating my own layout resource in an xml file which inherits everything from android.R.layout.simple_spinner_dropdown_item and allows me to override the textColor?

Nie, ale można wyciąć & wklej swoją ulubioną wersję simple_spinner_dropdown_item.xml do nowego pliku po prostu zmienić kolor tekstu.

Or is the complete definition of android.R.layout.simple_spinner_dropdown_item available somewhere?

Tak, ale istnieje wiele różnych wersji. Który interfejs API Ci odpowiada? Również może mieć kopię na dysku twardym już sprawdzić <android-sdk>/platforms/android-xx/data/res/layout/ (gdzie xx jest szczególnym API.)


W alternatywnym podejściu można utworzyć własny zasilacz i zmienić kolor tekstu po nadmuchać każdy wiersz , ale powyższa metoda będzie nieco szybsza, ponieważ nie pociąga za sobą żadnych zmian czasu pracy.

+0

thx vm :-). W rzeczywistości już znalazłem twoje alternatywne podejście, ale teraz powiedziałeś mi, gdzie szukać definicji xml, które prawdopodobnie przerzucę na to. – Stochastically

+0

+1 za Twój sposób myślenia ... Dodałem do twojego rozwiązania, ponieważ nie zadziała od razu, bez zmian. – whyoz

0

Bez użycia niestandardowego adaptera nie da się zmienić kolor

android.R.layout.simple_spinner_dropdown_item 

Lepiej stworzyć adapter niestandardowy, a następnie można zmienić kolor, testSixe, textstyle itd

+0

cóż, jeśli zrobisz to, co Sam mówi, to możesz edytować simple_spinner_dropdown_item.xml ... – whyoz

9

Aby rozwinąć na Sam rozwiązanie, będziesz musiał zmodyfikować plik w bardzo specyficzny sposób, aby nadpisać style Androida.

Po skopiowaniu simple_spinner_dropdown_item.xml z folderu sdk do odpowiedniego folderu układ, na którym pracujemy, widać ten kod:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/text1" 
style="?android:attr/spinnerDropDownItemStyle" 
android:singleLine="true" 
android:layout_width="match_parent" 
android:layout_height="?android:attr/dropdownListPreferredItemHeight" 
android:ellipsize="marquee" /> 

Aby zmienić tło na TextView i uniknąć tego błędu:

.../res/layout/simple_spinner_dropdown_item.xml:20: error: Error: Attribute is not public. (at 'layout_height' with value '?android:attr/dropdownListPreferredItemHeight').

kod trzeba będzie wyglądać następująco:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/spinnerText" 
style="@style/SpinnerTextViewItem" 
android:singleLine="true" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:ellipsize="marquee" /> 

Inną główną zmianą, którą należy wprowadzić, jest stworzenie własnego stylu. Prawdopodobnie masz plik styles.xml, więc dodać nowy styl podobny do tego:

<style name="SpinnerTextViewItem" parent="@android:style/Widget.TextView" > 
    <item name="android:textStyle">normal</item> 
    <item name="android:background">@color/green</item> 
</style> 

Zakładając, że masz coś w pliku colors.xml można ustawić kolor poprzez „@ kolor/zielony” lub cokolwiek wybierz kolor (oczywiście możesz użyć @android: color/...), nie wspominając o wszystkich innych elementach, które możesz dodać, aby zmienić TextView.