【发布时间】:2015-05-20 18:02:10
【问题描述】:
我有一个庞大的 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”。
在处理MyCustomComponent 元素时,有没有办法将“@dimen/standard_anim_factor”解析为资源的实际值(即“1.85”)?
【问题讨论】:
-
无法理解您的问题,如果您获得价值
0.7,那么它为什么指向standard_anim_factor,或者如果它指向它,问题是什么? -
感谢您指出这一点。我编辑了问题以使其更具可读性。
标签: android lint android-lint