Как получить атрибуты с пространством имен "Android" в пользовательском TextView
В обычай TextView
Я пытаюсь получить значение text
атрибут (например).
TypedArray values = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TextView);
String text = values.getString(com.android.internal.R.styleable.TextView_text);
Но я получаю это сообщение об ошибке:
пакет com.android.internal.R не существует
Так как же получить атрибуты "по умолчанию" TextView?
4 ответа
Класс internal.R не виден, поэтому вы можете читать их только через их методы доступа и только после вызова вашего супер-конструктора.
Посмотрите источник TextView, чтобы увидеть, как он работает внутри.
Если вы хотите иметь доступ к этим атрибутам "android", вы можете "переопределить" их: в вашем декларируемом стиле, например.
<attr name="android:padding"/>
Тогда вы можете легко получить это так:
int padding = a.getInt(R.styleable.CustomView_android_padding, -1);
Просто на заметку anwser вдохновлен исходным кодом макета TwoWayView, реализованного Lucas Rocha. Я думаю, что это хороший пример для анализа того, как реализовать пользовательские представления
Пример:
val attrsArray = intArrayOf(android.R.attr.digits, android.R.attr.text)
val ta = context.obtainStyledAttributes(attrs, attrsArray)
val digits = ta.getString(0)
val text = ta.getText(1)
ta.recycle()
Для доступа к ресурсу com.android.internal.R вы можете использовать
Resources.getSystem().getIdentifier(name, defType, defPackage)
Ссылка может быть полезной: