最直接的方法是将“onClick”属性直接添加到您使用的 MathML 中,并从那里使用元素 ID 和 Java/JavaScript 方法绑定。但是据我所知,MathML 不(还?)支持“onClick”属性。
我所做的修改是为每个可点击的 MathML 元素添加链接,然后为 WebView 重载 WebViewClient 的 shouldOverrideUrlLoading() 方法,以捕获被调用的链接。然后,如果您在链接中的某处添加唯一的 ID 值,您可以识别单击了哪个元素。
更改您上传的 MathML
如果您的原始 MathML 如下所示:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<msqrt>
<msup><mi>b</mi><mn>2</mn></msup>
<mo>−</mo>
<mn>4</mn><mi>a</mi><mi>c</mi>
</msqrt>
</math>
将其更改为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<msqrt href=id1>
<msup><mi>b</mi><mn>2</mn></msup>
<mo>−</mo>
<mstyle href=id2><mn>4</mn><mi>a</mi><mi>c</mi></mstyle>
</msqrt>
</math>
注意嵌套链接。当为 MathJax 使用 HTML-CSS 输出时,只有最低的链接被主动点击。但是,当使用 SVG 输出时,每个链接都按从最低级别到最高级别的顺序调用。因此,对于我的建议,您必须使用 MathJax 的 HTML-CSS 输出。如果我找到使 SVG 工作的方法,我将进行编辑。
重载 shouldOverrideUrlLoading()
这在有关此的许多 StackOverflow 问题中都有描述,您可以参考 Android Devs 网站了解详情(此处),因此我不会详细介绍。基本上, shouldOverrideUrlLoading() 将有一个 url 字符串,其中包含您为刚刚单击的 MathML 元素指定的链接。解析它的 ID 值并将其发送到可以使用它的函数,你就可以开始了。
这是我在项目中使用的代码。
public class MathmlLinksViewClient extends WebViewClient {
//protected MainActivity activity;
public MathmlLinksViewClient(MainActivity context) {
activity = context;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// Reroutes id int value to MainActivity method
activity.onMathmlClick(
Integer.valueOf(
// Method I wrote to parse ID from URL
HtmlIdFormat.getIdFromString(url) ) );
return true;
}
}
请注意,传递给此函数的 url 并不完全是您在 MathML 元素中包含的链接。在为您的 WebView 使用 WebView.loadDataWithBaseUrl() 方法时,这些中的每一个都由指定的主机链接添加。(我假设您正在按照本指南渲染 MathML。)
如果您的视图操作任何其他 HTML 链接,您需要添加一个 if 语句来分隔对 MathML 元素链接和网站链接的操作。同样,您可以研究如何有效地使用 shouldOverrideUrlLoading()。
一个缺点是它会将蓝色链接颜色添加到所有链接对象。您应该能够在 MathML 中通过使用 mstyle 声明将所有元素的颜色设置为黑色来覆盖它,但我目前在这样做时遇到了问题。
我没有涵盖所有内容,但我希望这会有所帮助!