setTextAppearance с использованием атрибутов темы программно - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть пользовательский textAppearance, определенный в моих темах. Моя тема выглядит так

<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
.....
<item name="textAppearanceHeadline3">@style/TextAppearance.MySpark.Headline3</item>
.....
</style>

Вот стиль TextAppearance.MyApp.Headline3

<style name="TextAppearance.MyApp.Headline3" parent="TextAppearance.MaterialComponents.Headline3">
        <item name="fontFamily">@font/avenir_next_demi</item>
        <item name="android:textSize">40sp</item>
        <item name="android:gravity">left|top</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">?attr/colorOnSurface</item>
    </style>

Работает для XML

<com.google.android.material.textview.MaterialTextView
        android:textAppearance="?attr/textAppearanceHeadline3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/add_product_description"/>

РАБОТАЕТ для программной ссылки на стиль

textView.setTextAppearance(R.style.TextAppearance_MyApp_Headline3)

НЕ РАБОТАЕТ Когда я хочу применить textAppearance программно с помощью attr, я не смог найти способ для что-то вроде этого.

textView.setTextAppearance(R.attr.textAppearanceHeadline3)

Я хотел бы использовать attr, который помогает мне в переключении различных тем.

1 Ответ

1 голос
/ 04 февраля 2020

Каждый ресурс Android имеет целочисленный идентификатор, связанный с ним. Атрибуты ссылаются только на идентификатор ресурса, а не на сам ресурс. Чтобы разрешить этот идентификатор ресурса из атрибута, вы используете Context.obtainStyledAttributes с массивом атрибутов:

val attrs = intArrayOf(R.attr.myTextAppearance)       // The array of attributes we're interested in.
val ta = context.obtainStyledAttributes(attrs)        // Get the value referenced by the attributes in the array
val resId = ta.getResourceId(0, 0)                    // The first 0 is the index in the 'attrs' array.
ta.recycle()                                          // Don't forget that! You can also use TypedArray.use { } extensions from android KTX.
TextViewCompat.setTextAppearance(textView, resId)     // Utility method to set text appearance for all SDK versions

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

Когда вы передаете идентификатор ресурса в setTextAppearance, TextView разрешает все значения атрибутов в стиле TextAppearance (обычно это список атрибутов). ), сохраняя значения в TypedArray, затем считывает и применяет их.

Использование resolveAttribute, как я впервые предложил, аналогично использованию obtainStyledAttributes, но TypedValue автоматически устанавливается на значение атрибута, в этом регистр ID ресурса, без необходимости звонить getResourceId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...