如何使用Android TagHandler读取自定义HTML标签属性

3
我扩展了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文本中访问自定义标记中的属性。我必须包含看起来像@rekire的黑魔法的代码,使用反射来访问xmlReader属性。(这些元素对“裸眼”不可见)。 链接在这里:link。无需使用重复的Java类或实际上包括id在其指定中的时髦标记名称!再次感谢@rekire。添加了从链接帖子转述的代码,这将解决问题。

他们没有传递属性,所以你可能无法这样做。 - pskink
@pskink - 这里尝试使用反射。链接 - 不确定如何在我的情况下实现这一点 - 我只能解析由xmlReader声明的字段,而不能解析任何“自定义”内容。 - narkis
如果您确实需要访问自定义标记中的属性,请复制/粘贴Html类并将Attributes作为第三个参数传递,而不是XmlReader。 - pskink
在迭代xmlReader时,跟踪可用的字段后,我似乎有以下内容的句柄:HEADER_SIZES、mImageGetter、mReader、mSource、mSpannableStringBuilder和mTagHandler。在我开始剪切粘贴之前,这些中的任何一个可能有用吗? - narkis
请查看 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/Html.java,方法 handleStartTag,您需要它的第二个参数而不是任何类字段。 - pskink
已经检查过了 - 谢谢 - 现在正在尝试找到更优雅的方法来完成这个操作,而不需要使用剪切和粘贴。 - narkis
1个回答

0

可以通过将xmlReader的ContentHandler替换为自己的ContentHandler来钩取并访问属性,从而实现相关功能。然而,对于第一个 html 标签,这种方法不起作用,因此必须在开头添加一个伪标签。详细答案请参见


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接