Как получить атрибуты с пространством имен "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)

Ссылка может быть полезной:

Другие вопросы по тегам