在我的android应用程序中处理textview链接点击

我目前正在像这样在TextView中呈现HTML输入:

tv.setText(Html.fromHtml("<a href='test'>test</a>"));

所显示的HTML是通过外部资源提供给我的,因此我无法按照自己的意愿更改内容,但我当然可以用一些正则表达式篡改HTML,将href值改为其他值。

我想要的是能够直接从应用内处理链接点击,而不是让链接打开浏览器窗口。 这完全可以实现吗? 我猜测可以将href-value的协议设置为“myApp://”之类的东西,然后注册一些让我的应用程序处理该协议的东西。 如果这确实是最好的方法,我想知道这是怎么做的,但我希望有一种更简单的方式来说,“当在这个文本视图中点击一个链接时,我想提出一个接收的事件链接的href值作为输入参数“


将近一年之后,我有一种不同的方式解决了我的特殊问题。 由于我希望链接被我自己的应用程序处理,所以有一个更简单的解决方案。

除了默认的意图过滤器之外,我只是让我的目标活动监听ACTION_VIEW意图,特别是使用方案com.package.name

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="com.package.name" />  
</intent-filter>

这意味着以我的活动处理以com.package.name://开头的链接。

所以我所要做的就是构建一个包含我想传达的信息的URL:

com.package.name://action-to-perform/id-that-might-be-needed/

在我的目标活动中,我可以检索这个地址:

Uri data = getIntent().getData();

在我的示例中,我可以简单地检查data是否为空值,因为如果它不为空,我就会知道它是通过这种链接调用的。 从那里,我从网址中提取我需要的说明,以便能够显示适当的数据。


另一种方式,从Linkify借鉴一下,但允许您自定义您的处理。

自定义跨度类别:

public class ClickSpan extends ClickableSpan {

    private OnClickListener mListener;

    public ClickSpan(OnClickListener listener) {
        mListener = listener;
    }

    @Override
    public void onClick(View widget) {
       if (mListener != null) mListener.onClick();
    }

    public interface OnClickListener {
        void onClick();
    }
}

助手功能:

public static void clickify(TextView view, final String clickableText, 
    final ClickSpan.OnClickListener listener) {

    CharSequence text = view.getText();
    String string = text.toString();
    ClickSpan span = new ClickSpan(listener);

    int start = string.indexOf(clickableText);
    int end = start + clickableText.length();
    if (start == -1) return;

    if (text instanceof Spannable) {
        ((Spannable)text).setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    } else {
        SpannableString s = SpannableString.valueOf(text);
        s.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        view.setText(s);
    }

    MovementMethod m = view.getMovementMethod();
    if ((m == null) || !(m instanceof LinkMovementMethod)) {
        view.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

用法:

 clickify(textView, clickText,new ClickSpan.OnClickListener()
     {
        @Override
        public void onClick() {
            // do something
        }
    });

如果文本视图中有多个链接。 例如textview具有“https://”和“tel no”,我们可以自定义LinkMovement方法并根据模式处理单词的点击。 附件是定制的链接移动方法。

public class CustomLinkMovementMethod extends LinkMovementMethod
{

private static Context movementContext;

private static CustomLinkMovementMethod linkMovementMethod = new CustomLinkMovementMethod();

public boolean onTouchEvent(android.widget.TextView widget, android.text.Spannable buffer, android.view.MotionEvent event)
{
    int action = event.getAction();

    if (action == MotionEvent.ACTION_UP)
    {
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);
        if (link.length != 0)
        {
            String url = link[0].getURL();
            if (url.startsWith("https"))
            {
                Log.d("Link", url);
                Toast.makeText(movementContext, "Link was clicked", Toast.LENGTH_LONG).show();
            } else if (url.startsWith("tel"))
            {
                Log.d("Link", url);
                Toast.makeText(movementContext, "Tel was clicked", Toast.LENGTH_LONG).show();
            } else if (url.startsWith("mailto"))
            {
                Log.d("Link", url);
                Toast.makeText(movementContext, "Mail link was clicked", Toast.LENGTH_LONG).show();
            }
            return true;
        }
    }

    return super.onTouchEvent(widget, buffer, event);
}

public static android.text.method.MovementMethod getInstance(Context c)
{
    movementContext = c;
    return linkMovementMethod;
}

这应该从以下方式从textview中调用:

textViewObject.setMovementMethod(CustomLinkMovementMethod.getInstance(context));
链接地址: http://www.djcxy.com/p/87389.html

上一篇: handle textview link click in my android app

下一篇: Colorizing Windows command line output from PHP