24

我想要一个TextView既可选择又可链接的。当我两者都做时,我最终得到了可选择的文本,但无法点击链接。

编辑:

我将展示代码来解释我的挣扎:

    TextView textView = view.findViewById(R.id.mytext);
    textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah");
    Linkify.addLinks(textView, Linkify.ALL);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        textView.setTextIsSelectable(true);
    }
4

3 回答 3

15

您是否尝试将其添加到您的 TextView xml 代码中?

    <TextView
    ...
    android:autoLink="all"
    android:textIsSelectable="true" />

我已经在我的代码上尝试过,我可以在网络/邮件上拨打电话/冲浪,还可以选择所有文本。

于 2013-02-19T16:33:58.150 回答
15

autoLink属性有一个烦人的错误:如果您在电话号码上单击示例,然后返回并单击第二个 url 链接 - 它会再次打开电话号码。这个属性对多个链接的效果很差,我已经实现了自己的类,这里是 Github ClickableLinksTextView.java上的链接

TextView在您的示例中,您可以在 xml-layout中用我的类替换您的类ClickableLinksTextView并更改如下代码:

ClickableLinksTextView textView = (ClickableLinksTextView)view.findViewById(R.id.mytext);
textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah");
Linkify.addLinks(textView, Linkify.ALL);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    textView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    textView.setTextIsSelectable(true);
    // the autoLink attribute must be removed, if you hasn't set it then ok, otherwise call textView.setAutoLink(0);
}

您问题中问题的最初原因是LinkMovementMethod类和textIsSelectable属性根本不兼容,甚至 Android OS 开发人员在Android OS 源代码中也承认这一点。

不要更改支持文本选择的文本的移动方法,因为它会阻止任意光标位移。

如果文本视图是可选的,则只有 2 个正确的移动方法值是nullArrowKeyMovementMethod。这就是我ArrowKeyMovementMethod在示例中明确设置的原因,因为Linkify.addLinks设置了不正确的移动方法,我应该恢复它。

至于autoLink属性的bug,是因为android开发者没有正确复制链接检测。您可以查看@cheng yang 的答案中的代码示例,无论您拥有多少个,代码都只是获取第一个链接。

于 2013-04-14T19:21:39.607 回答
2

问题出在 Android 的TextView. 调用本身Linkify.addLinks()不会更改自动链接掩码TextView。我认为他们检查 mAutoLinkMask 是一个 Android 错误。因此,如果您android:autoLinkxml文件中设置或调用setAutoLinkMask()非 0 值,它将起作用。

仅供参考,TextView的源代码:

            if (touchIsFinished && mLinksClickable && mAutoLinkMask != 0 && textIsSelectable) {
            // The LinkMovementMethod which should handle taps on links has not been installed
            // on non editable text that support text selection.
            // We reproduce its behavior here to open links for these.
            ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(),
                    getSelectionEnd(), ClickableSpan.class);

            if (links.length > 0) {
                links[0].onClick(this);
                handled = true;
            }
        }
于 2013-03-04T00:12:07.107 回答