2012-12-05 16 views
61

Aktualnie używam WebView lub TextView, aby wyświetlić dynamiczne dane pochodzące z usługi internetowej w jednej z moich aplikacji. Jeśli dane zawierają czysty tekst, używa on TextView i stosuje styl ze styles.xml. Jeśli dane zawierają kod HTML (głównie tekst i obrazy), korzysta on z WebView.Jak pobierać atrybuty stylu programowo z styles.xml

Jednak ten WebView jest nieaktualny. Dlatego wygląda zupełnie inaczej niż zwykły TextView. Przeczytałem, że możliwe jest stylizowanie tekstu w WebView po prostu przez wstawienie kodu HTML bezpośrednio do danych. Brzmi to dość łatwo, ale chciałbym użyć danych z mojego pliku Styles.xml jako wartości wymaganych w tym kodzie HTML, więc nie będę musiał zmieniać kolorów i dwóch lokalizacji, jeśli zmienię swój styl.

Jak mógłbym to zrobić? Zrobiłem obszerne wyszukiwanie, ale nie znalazłem sposobu na odzyskanie różnych atrybutów stylu z pliku styles.xml. Czy tu coś pomijam, czy nie jest możliwe odzyskanie tych wartości?

Styl Próbuję uzyskać dane z jest następujący:

<style name="font4"> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:textSize">14sp</item> 
    <item name="android:textColor">#E3691B</item> 
    <item name="android:paddingLeft">5dp</item> 
    <item name="android:paddingRight">10dp</item> 
    <item name="android:layout_marginTop">10dp</item> 
    <item name="android:textStyle">bold</item> 
</style> 

Jestem zainteresowana głównie TEXTSIZE i textColor.

+0

Dlaczego nie można po prostu analizowania XML (SAX parsera np Android)? – m0skit0

Odpowiedz

128

Programowo można pobrać style niestandardowe z styles.xml.

zdefiniować pewne arbitralne styl styles.xml:

<style name="MyCustomStyle"> 
    <item name="android:textColor">#efefef</item> 
    <item name="android:background">#ffffff</item> 
    <item name="android:text">This is my text</item> 
</style> 

Teraz odzyskać style jak ten

// The attributes you want retrieved 
int[] attrs = {android.R.attr.textColor, android.R.attr.background, android.R.attr.text}; 

// Parse MyCustomStyle, using Context.obtainStyledAttributes() 
TypedArray ta = obtainStyledAttributes(R.style.MyCustomStyle, attrs); 

// Fetch the text from your style like this.  
String text = ta.getString(2); 

// Fetching the colors defined in your style 
int textColor = ta.getColor(0, Color.BLACK); 
int backgroundColor = ta.getColor(1, Color.BLACK); 

// Do some logging to see if we have retrieved correct values 
Log.i("Retrieved text:", text); 
Log.i("Retrieved textColor as hex:", Integer.toHexString(textColor)); 
Log.i("Retrieved background as hex:", Integer.toHexString(backgroundColor)); 

// OH, and don't forget to recycle the TypedArray 
ta.recycle() 
+0

Awesome mate pracy. Po tym, jak powiedziano (i dużo go przeczytałem), że nie da się tego zrobić, doskonale pokazałeś, że to możliwe. Właśnie wypróbowałem to i byłem w stanie uzyskać kolor czcionki z mojego stylu. Nie mogę jeszcze napisać tekstów, ale to wymyślę.100 punktów pojawi się na twojej drodze, jak tylko mogę wysłać nagrodę (18 godzin od teraz). Wielkie dzięki! –

+4

jest również możliwa zmiana wartości zdefiniowanych w stylu w czasie wykonywania? – ekjyot

+0

Co się stanie, jeśli chcę zmienić kolor pobieranych atrybutów? Jak dynamiczna zmiana koloru tła lub tekstu w tym kodzie? – MSIslam

28

odpowiedź @Ole dał wydaje się złamać podczas korzystania z niektórych atrybutów, takich jak shadowColor, shadowDx, shadowDy, shadowRadius (to tylko niektóre z nich znalazłem, może być ich więcej)

Nie mam pojęcia, co do dlaczego Ten problem występuje, o co pytam w sprawie here, ale styl kodowania @AntoineMarques wydaje się rozwiązać ten problem.

Aby uczynić tę pracę z dowolnego atrybutu byłoby coś takiego


Najpierw zdefiniować łatwym do układania zawierają identyfikatory zasobów jak tak

attrs.xml

<resources>  
    <declare-styleable name="MyStyle" > 
     <attr name="android:textColor" /> 
     <attr name="android:background" /> 
     <attr name="android:text" /> 
    </declare-styleable> 
</resources> 

Następnie w kodzie zrobi to, aby uzyskać tekst.

TypedArray ta = obtainStyledAttributes(R.style.MyCustomStyle, R.styleable.MyStyle); 
String text = ta.getString(R.styleable.MyStyle_android_text); 

Zaletą korzystania z tej metody jest pobieranie wartości według nazwy, a nie indeksu.

+3

To powinno być zaakceptowaną odpowiedzią, ponieważ odpowiedź Ole'a generowała dla mnie ostrzeżenie "oczekiwane źródło stylu". – thecoolmacdude

+1

Działa dla mnie, ale z Androidem Studio muszę to poprzedzić '@SuppressWarnings (" ResourceType ")'. – eruve

+2

Ta odpowiedź powinna być zaakceptowana. To praca dla wszystkich moich atrybutów, a ten, który głosował najwięcej, zmarnował mi dużo czasu. – jerry

0

Jeśli akceptowane rozwiązanie nie działa na próbie zmiany nazwy attr.xml do attrs.xml (pracował dla mnie)

Powiązane problemy