【问题标题】:How to read custom html tag attributes using Android TagHandler如何使用 Android TagHandler 读取自定义 html 标签属性
【发布时间】: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


【解决方案1】:

可以通过将 xmlReader ContentHandler 替换为您自己的 ContentHandler 来挂钩 XMLReader 并获取访问属性。此方法不适用于第一个 html 标签,因此必须在开头添加一个假标签。 See detailed answer.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多