HTML自定义链接点击侦听器的文本

时间:2018-09-06 09:43:45

标签: java android kotlin

这是示例HTML字符串,

<span class=\"proflinkWrapper\"><span class=\"proflinkPrefix\">+<\/span><a class=\"proflink\" href=\"https://plus.google.com/114461178896543099856\" oid=\"114461178896543099856\">Elon Musk<\/a><\/span> hey

使用HTML.fromHtml,我明白了,

+Elon Musk hey

在单击+ Elon Musk时,它将带我到浏览器,但我需要相应的URL并在我的应用程序中使用它,给我带来建议的人! (我不需要跨度,因为内容是非常动态的并且是HTML格式)

是否可以拦截Html.fromHtml并获取URL,并使其无法在浏览器中打开,并根据需要在我的应用程序中使用它?

2 个答案:

答案 0 :(得分:0)

我们可能只是这样获得href值:

String ht = "<span class=\"proflinkWrapper\"><span class=\"proflinkPrefix\">+</span><a class=\"proflink\" href=\"https://plus.google.com/114461178896543099856\" oid=\"114461178896543099856\">Elon Musk</a></span> hey";

int hrefIndex = ht.indexOf("href=");
if (hrefIndex >= 0) {
    int startIndex = hrefIndex + "href=".length();
    int endIndex = ht.indexOf('"', hrefIndex + "href=".length() + 1);

    if (startIndex > 0 && endIndex > 0) {
        String href = ht.substring(startIndex, endIndex);
    }
}

答案 1 :(得分:0)

我通过修改LinkMovementMethod找到了解决方法

public function makeActive(Request $request, $id)
{
  $category = Category::findOrFail($id);

  if($request->has('active'))
  { 
    $category->active = 1;
  }else{
    $category->active = 0;
  }

  $category->save();
}

您可以通过修改代码来添加自己的侦听器,目前,我已经为URL点击添加了一个侦听器。您可以通过添加以下行在代码中使用它:

import android.text.Spannable
import android.text.style.URLSpan
import android.view.MotionEvent
import android.widget.TextView

class MyLinkMovementMethod(var onUrlClickListener: (String) -> Unit) : android.text.method.LinkMovementMethod() {

    override fun onTouchEvent(widget: TextView, buffer: Spannable, event: MotionEvent): Boolean {
        val action = event.action

        if (action == MotionEvent.ACTION_UP) {
            var x = event.x.toInt()
            var y = event.y.toInt()
            x -= widget.totalPaddingLeft
            y -= widget.totalPaddingTop
            x += widget.scrollX
            y += widget.scrollY

            val layout = widget.layout
            val line = layout.getLineForVertical(y)
            val off = layout.getOffsetForHorizontal(line, x.toFloat())

            val link = buffer.getSpans(off, off, URLSpan::class.java)
            if (link.isNotEmpty()) {
                val url = link[0].url
                if (url.contains("https") or url.contains("tel") or url.contains("mailto") or url.contains("http") or url.contains("https") or url.contains("www")) {
                    onUrlClickListener(url)
                }
                return true
            }
        }
        return super.onTouchEvent(widget, buffer, event)
    }
}

代码在科特林。