2013-06-14 10 views
9

Po przeczytaniu przez References To Theme Attributes próbuję odwołać się do wartości atrybutu w ustawionym przeze mnie niestandardowym motywie.Zastępowanie odwoływanych atrybutów stylu

Ja stosując styl zdefiniowany przez użytkownika do CheckedTextView

<CheckedTextView 
    android:id="@+id/contactInfo" 
    style="@style/ListViewCheckedTextViewRowStyle" > 
</CheckedTextView> 

styl zdefiniowany przez użytkownika jest zdefiniowany jako:

<style name="ListViewCheckedTextViewRowStyle" parent="@style/ListViewRowStyle"> 
    <item name="android:checkMark">?android:listChoiceIndicatorMultiple</item> 
</style> 

Mój motyw stworzyłem jest zdefiniowany jako:

<style name="Theme.Yellowgreen" parent="android:Theme.Holo.Light.DarkActionBar"> 
    <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check_holo_light</item> 
</style> 

Jednak wyświetlana stylistyka checkMark to drawab domyślnego urządzenia le, a nie mój zdefiniowany przez użytkownika drawowalny.

Jedynym sposobem mogę mieć mój odkształcalne wyświetlany jest z:

<style name="ListViewCheckedTextViewRowStyle" parent="@style/ListViewRowStyle"> 
    <item name="android:checkMark">@drawable/btn_check_holo_light</item> 
</style> 

Ale pokonuje cały cel nadrzędny tego atrybutu, zwłaszcza, że ​​chciałbym zmienić to atrybut w wielu tematów.

ja ustawienie motywu w metodzie onCreate() z moich Activity jak ten:

public void onCreate(Bundle savedInstanceState) { 
    this.setTheme(R.style.Theme_Yellowgreen); 
    super.onCreate(savedInstanceState); 
    // ... 
} 

Próbowałem też ustawić motyw w AndroidManifest.xml złożyć jak:

<application android:theme="@style/Theme.Yellowgreen" > 

ale nie działa. Co może być nie tak?

Aktualizacja

Właśnie stworzył małą przykładowy projekt i wygląda kodu napisałem powyżej działa. Muszę więc mieć inne style, które nadpisują tę właściwość lub może ma to związek z plikami xml mojego układu.

W moim dużym projekcie mam dwa Fragments w ramach Activity. Zarówno Fragments mają Listviews wspierane przez Adapters. W Fragment A sposób według AdaptergetView() następująco:

public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.contact_entry, null); 
    } 

    //... 

    return convertView; 
} 

w Fragment B sposób według AdaptergetView() następująco:

public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item, parent, false); 
    } 

    //... 

    return convertView; 
} 

Układy są zdefiniowane w następujący sposób:

list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_item" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <include layout="@layout/list_item_header" /> 

    <include layout="@layout/contact_entry" /> 

    <View android:id="@+id/list_divider" 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="@android:drawable/divider_horizontal_dark" /> 

</LinearLayout> 

list_item_header.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/header_text" 
    android:layout_width="match_parent" 
    android:layout_height="25dip" 
    android:background="@color/dark_blue" 
    android:gravity="center_vertical" 
    android:paddingLeft="6dip" 
    android:textColor="@color/white" 
    android:textSize="14sp" 
    android:textStyle="bold" /> 

contact_entry.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/contactEntry" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:orientation="horizontal" > 

    <QuickContactBadge 
     android:id="@+id/contactPic" 
     style="@style/ContactPicStyle" /> 

    <CheckedTextView 
     android:id="@+id/contactInfo" 
     style="@style/ListViewCheckedTextViewRowStyle" > 
    </CheckedTextView> 

</LinearLayout> 

Z jakiegoś powodu w Fragment B Tematyczna atrybut haczykiem nie renderuje poprawnie podczas gdy w Fragment A, zaznaczenie używa bieżącego żółto Skórka i jest stylizowany poprawnie. Dlaczego tak się dzieje?

+0

Czy w manifeście określono motyw _YellowGreen_? – dominus

+0

Właśnie stworzyłem przykładowy projekt, aby przetestować twoje pliki stylów i wszystko działa dobrze dla mnie. Więc drugie pytanie _dominus'_: czy w manifeście ustawiłeś motyw aktywności na "YellowGreen"? – Idolon

+0

hej @dominus i @Idolon, zaktualizowałem pytanie. Próbowałem ustawić temat działania na dwa różne sposoby, ale nie udało się nadpisać atrybutu stylu "android: listChoiceIndicatorMultiple". – toobsco42

Odpowiedz

11

myślę, że trzeba tę linię w temacie

<item name="android:checkedTextViewStyle">@style/ListViewCheckedTextViewRowStyle</item> 

tak to będzie wyglądać następująco:

<style name="Theme.Yellowgreen" parent="android:Theme.Holo.Light.DarkActionBar"> 
    <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check_holo_light</item> 
    <item name="android:checkedTextViewStyle">@style/ListViewCheckedTextViewRowStyle</item> 
</style> 

UPDATE

Po aktualizacji Pytania i kilka dodatkowych informacji komentarzach formularza odkryliśmy, że problem był w Context. To był ten sam błąd co moje pytanie: Android color selector doesn't work with custom attributes

Do jednego fragmentu przekazano Activity i do innego Application. Nie jestem ekspertem, ale nawet obie te klasy rozszerzają się o Context tylko Activity, która rozszerza ContextThemeWrapper, która zawiera informacje o stylach. Pomocne może być przeczytanie tego artykułu w celu przyszłego zrozumienia Kontekst: http://www.doubleencore.com/2013/06/context/

+0

Hej @Mikoos, Właśnie próbowałem dodać ten atrybut do mojego motywu, ale niestety nie zastępuje on atrybutu "android: listChoiceIndicatorMultiple". – toobsco42

+0

Może być łatwiej, jeśli dasz nam cały przykładowy projekt na github z komentarzami, co dokładnie chcesz osiągnąć. Rozwiązanie może być podane za pomocą żądania odpytywania. – Mikooos

+0

Dzięki @Mikoos, opublikowałem więcej kodu mojego projektu i wierzę, że jestem coraz bliżej odkrycia, co jest nie tak. Mam nadzieję, że dostarczyłem wystarczająco dużo szczegółów. – toobsco42