У меня есть большая база данных Android, и я пишу пользовательское правило lint, которое проверяет, попадают ли значения определенных атрибутов в заданный диапазон.
Например, у меня есть этот компонент:
<MyCustomComponent
my:animation_factor="0.7"
...>
</MyCustomComponent>
и я хочу написать правило lint, которое предупреждает разработчиков о том, что значения my:animation_factor
>= 1 следует использовать с осторожностью.
Я выполнил инструкции http://tools.android.com/tips/lint-custom-rules и смог получить значение my:animation_factor
с помощью этого кода:
import com.android.tools.lint.detector.api.*;
public class XmlInterpolatorFactorTooHighDetector {
....
@Override
public Collection<String> getApplicableElements() {
return ImmutableList.of("MyCustomComponent");
}
@Override
public void visitElement(XmlContext context, Element element) {
String factor = element.getAttribute("my:animation_factor");
...
if (value.startsWith("@dimen/")) {
// How do I resolve @dimen/xyz to 1.85?
} else {
String value = Float.parseFloat(factor);
}
}
}
Этот код отлично работает, когда атрибуты, такие как my:animation_factor
, имеют литеральные значения (например, 0.7
).
Однако, когда значением атрибута является ресурс (например, @dimen/standard_anim_factor
), тогда element.getAttribute(...)
возвращает строковое значение атрибута вместо фактического разрешенного значения.
Например, когда у меня есть MyCustomComponent
, который выглядит так:
<MyCustomComponent
my:animation_factor="@dimen/standard_anim_factory"
...>
</MyCustomComponent>
и @dimen/standard_anim_factor
определяется в другом месте:
<dimen name="standard_anim_factor">1.85</dimen>
тогда строка factor
станет "@dimen/standard_anim_factor" вместо "1.85".
Есть ли способ разрешить "@dimen/standard_anim_factor" фактическое значение ресурса (т.е. "1.85" ) при обработке элемента MyCustomComponent
?