Как получить атрибуты стиля программно из стилей.XML


В настоящее время я использую либо WebView, либо TextView, чтобы показать некоторые динамические данные, поступающие из веб-сервиса в одном из моих приложений. Если данные содержат чистый текст, он использует TextView и применяет стиль из стилей.XML. Если данные содержат HTML (в основном текст и изображения), он использует WebView.

тем не менее, это веб-представление не имеет стиля. Поэтому он сильно отличается от обычного TextView. Я читал, что можно стилизовать текст в веб-представлении, просто вставив некоторый HTML прямо в данные. Это звучит достаточно просто, но я хотел бы использовать данные из моих стилей.xml как значения, необходимые в этом HTML, поэтому мне не нужно будет менять цвета и т. д. В двух местах, если я изменю свои стили.

Итак, как бы я мог это сделать? Я сделал некоторые обширные поиски, но я не нашел способа на самом деле извлечения различных атрибутов стиля из ваших стилей.XML. Я что-то упустил здесь или это действительно невозможно получить эти ценности?

стиль, из которого я пытаюсь получить данные, следующий:

<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>

меня в основном интересует textSize и textColor.

3 64

3 ответа:

можно получить пользовательские стили из styles.xml программно.

задать произвольный стиль в 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>

теперь, получить стили, как это

// 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()

ответ @Ole дал, кажется, сломать при использовании определенных атрибутов, таких как shadowColor, shadowDx, shadowDy, shadowRadius (это только несколько я нашел, там может быть больше)

Я понятия не имею, как к почему эта проблема возникает, о которой я спрашиваю здесь, а @AntoineMarques стиль кодирования, кажется, решить эту проблему.

чтобы сделать эту работу с любым атрибутом было бы что-то вроде этого


Первый, определите стиль, который будет содержать идентификаторы ресурсов следующим образом

attrs.xml

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

затем в коде вы бы сделали это, чтобы получить текст.

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

преимущество использования этого метода заключается в том, что вы извлекаете значение по имени, а не по индексу.

Если принятое решение не работает, попробуйте переименовать attr.xml для attrs.xml (работал на меня)