Каждый ресурс 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
.