Obecnie używam WebView lub TextView do wyświetlania niektórych danych dynamicznych pochodzących z usługi sieci web w jednej z moich aplikacji. Jeśli dane zawierają czysty tekst, używa TextView i stosuje styl z styles.xml. Jeśli dane zawierają HTML (głównie tekst i obrazy), używa WebView.
Jednak ten WebView nie jest stylizowany. Dlatego wygląda znacznie inaczej niż zwykły TextView. Czytałem, że można stylizować tekst w WebView, po prostu wstawiając kod HTML bezpośrednio do danych. Brzmi to dość łatwo, ale chciałbym użyć danych z mojego Styles.xml jako wartości wymaganych w tym kodzie HTML, więc nie będę musiał zmieniać kolorów i tak dalej w dwóch lokalizacjach, jeśli zmienię style.
Jak więc miałbym to zrobić? Przeprowadziłem obszerne poszukiwania, ale nie znalazłem sposobu na odzyskanie różnych atrybutów stylu z pliku styles.xml. Czy coś mi tu brakuje, czy naprawdę nie można pobrać tych wartości?
Styl, z którego próbuję uzyskać dane, 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>
Interesuje mnie głównie textSize i textColor.
Odpowiedzi:
Możliwe jest
styles.xml
programowe pobieranie niestandardowych stylów z .Zdefiniuj dowolny styl w
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 pobierz takie style
// 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()
źródło
Odpowiedź, którą podał @Ole, wydaje się pękać, gdy używasz pewnych atrybutów, takich jak shadowColor, shadowDx, shadowDy, shadowRadius (to tylko kilka, które znalazłem, może być więcej)
Nie mam pojęcia, dlaczego występuje ten problem, o który tutaj pytam , ale styl kodowania @AntoineMarques wydaje się rozwiązać problem.
Aby to działało z dowolnym atrybutem, byłoby to coś takiego
Najpierw zdefiniuj styl, który będzie zawierał identyfikatory zasobów w ten sposób
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łbyś to, aby uzyskać tekst.
Zaletą korzystania z tej metody jest to, że pobierasz wartość według nazwy, a nie indeksu.
źródło
@SuppressWarnings("ResourceType")
.Odpowiedzi Ole i PrivatMamtora nie działały dobrze, ale tak się stało.
Powiedzmy, że chciałem programowo przeczytać ten styl:
<style name="Footnote"> <item name="android:fontFamily">@font/some_font</item> <item name="android:textSize">14sp</item> <item name="android:textColor">@color/black</item> </style>
Mógłbym to zrobić tak:
Inspirację zaczerpnąłem z klasy TextAppearanceSpan Androida, którą znajdziesz tutaj: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/style/TextAppearanceSpan.java
źródło
Jeśli zaakceptowane rozwiązanie nie działa, spróbuj zmienić nazwę attr.xml na attrs.xml (działało dla mnie)
źródło