Я использую тег представления, который выглядит следующим образом:
<EditText
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="this is the hint"
android:text="@string/dummy_content"
android:textColor="?colorAccent" />
Что примечательно в этом, так это то, что android:hint
представляет собой простой текст, android:text
является атрибутом ресурса и android:textColor
- это атрибут стиля.
Для всех трех я начинаю с AttributeSet.getAttributeValue()
.Для атрибутов простого текста это даст вам фактическое значение (например, для android:hint
это возвращает "this is the hint"
).
Атрибуты ресурса вместо этого возвращают строку, которая начинается с @
и затем является числом (например, для android:text
это возвращает "@2131689506"
).Затем вы можете проанализировать числовую часть этой строки и использовать Resources.getResourceName()
, чтобы получить разрешенное имя ("com.example.stackoverflow:string/dummy_content"
).
Атрибуты стиля возвращают строку, которая начинается с ?
и затем является числом (например,для android:textColor
это возвращает "?2130903135"
).Однако я не знаю ни одного способа преобразования этого числа в текстовое представление с помощью поддерживаемых API.Надеюсь, однако, что этого достаточно, чтобы помочь кому-то еще на пути к полному ответу.
Использование отражения
Если вы хотите сойти с рельсов, вы можете использовать отражениенайти текстовое значение атрибута стиля.Поскольку строка начинается с ?
, вы знаете, что она либо в R.attr
, либо в android.R.attr
.Вы можете отсканировать их для поиска подходящего поля с кодом, подобным следующему:
private static String scan(Class<?> classToSearch, int target) {
for (Field field : classToSearch.getDeclaredFields()) {
try {
int fieldValue = (int) field.get(null);
if (fieldValue == target) {
return field.getName();
}
} catch (IllegalAccessException e) {
// TODO
}
}
return null;
}
int id = Integer.parseInt(attributeValue.substring(1));
String attrName = scan(R.attr.class, id);
String androidAttrName = scan(android.R.attr.class, id);
Для меня это выдаст
colorAccent
null
Если значениеandroid:textColor
было бы ?android:colorAccent
вместо просто ?colorAccent
, вместо этого было бы вывод:
null
colorAccent