【发布时间】:2014-01-14 07:40:12
【问题描述】:
我正在扩展 Android TagHandler 类来处理 TextField 中的自定义 html 标签。到目前为止一切顺利,我能够拦截这些标签并将自定义功能分配给“onClick()”。但是 - 我无法捕获这些自定义标签的任何属性,例如:
"This is an example of a custom mark-up tag embedded in text that a text field would handle <custom id='1233' uri='0023'> CUSTOM </custom>and that I need to capture."
我能够捕获自定义标记的出现,但不能捕获具有以下属性的属性:
public class SpecialTagHandler implements TagHandler
{
@Override
public void handleTag(
boolean opening,
String tag,
Editable output,
XMLReader xmlReader)
{
if(tag.equalsIgnoreCase("custom")) {
// handle the custom tag
if(opening) {
Log.e(TAG, "found custom tag OPENING");
try {
Field elementField = xmlReader.getClass().getDeclaredField("theNewElement");
elementField.setAccessible(true);
try {
Object element = elementField.get(xmlReader);
Field attsField = element.getClass().getDeclaredField("theAtts");
attsField.setAccessible(true);
Object atts = attsField.get(element);
Field dataField = atts.getClass().getDeclaredField("data");
dataField.setAccessible(true);
String[] data = (String[])dataField.get(atts);
Field lengthField = atts.getClass().getDeclaredField("length");
lengthField.setAccessible(true);
int length = (Integer)lengthField.get(atts);
String mIdAttribute = null;
String mUrlAttribute = null;
for(int i = 0; i < length; i++) {
if("id".equals(data[i*5 + 1])) {
mIdAttribute = data[i*5 + 4];
} else if("uri".equals(data[i*5 + 1])) {
mUrlAttribute = data[i*5 + 4];
}
}
Log.e(TAG, "id: " + mIdAttribute + " url: " + mUrlAttribute);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (NoSuchFieldException e1) {
e1.printStackTrace();
}
}
}
}
}
还有关于如何读取 id 和 uri 属性的任何建议吗?有一个关于使用传递给这个函数的 XMLReader 的讨论。 提前致谢!
-------- 有答案! ---------
好吧 - 更多的挖掘和瞧!是的 - 您确实可以在标记的 html 文本中访问您的标签中的自定义属性。我必须包括使用反射访问 xmlReader 属性的@rekire 对我来说似乎是黑魔法的东西。 (这些元素都不是“肉眼”可见的)。 链接在这里:link。无需求助于在其名称中实际包含 id 的重复 Java 类或时髦的标签名称!再次感谢 - @rekire 添加了从链接帖子中解释的代码,可以解决问题。
【问题讨论】:
-
他们不传递属性所以可能你不能这样做
-
@pskink - 在这里尝试使用反射。 link - 不确定在我的情况下如何实现 - 我只能解析 xmlReader 声明的字段 - 不是任何“自定义”
-
如果您确实需要访问自定义标签中的属性复制/粘贴 Html 类并传递 Attributes 而不是 XmlReader 作为第三个参数
-
在跟踪可用的内容后,即在这种情况下迭代 xmlReader 时的字段,我似乎有以下处理:HEADER_SIZES、mImageGetter、mReader、mSource、mSpannableStringBuilder、mTagHandler。在我去剪切'n'pastin'之前,这些有什么用吗?
-
见github.com/android/platform_frameworks_base/blob/master/core/…,方法handleStartTag,你需要它的第二个参数而不是任何类字段,
标签: android html textview markup