Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 链接并可选择的文本视图?_Android_Textview_Linkify_Selectable - Fatal编程技术网

Android 链接并可选择的文本视图?

Android 链接并可选择的文本视图?,android,textview,linkify,selectable,Android,Textview,Linkify,Selectable,我想要一个既可选择又可链接的TextView。当我同时做这两件事时,我会得到可选择的文本,但是链接不能被点击 编辑: 我将展示代码来解释我所遇到的困难: TextView textView = view.findViewById(R.id.mytext); textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); Linkify.addLinks(textView,

我想要一个既可选择又可链接的
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);
    }

您是否尝试将此添加到TextView xml代码中

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


我已经在我的代码上试过了,我可以打电话/浏览网页/邮件,还可以选择所有文本。

问题在于Android的
TextView
。调用
Linkify.addLinks()
不会更改
TextView
本身中的自动链接掩码。 我认为他们检查mAutoLinkMask是Android的一个bug。 因此,如果您在
xml
文件中设置
android:autoLink
,或者调用
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;
            }
        }

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

在您的示例中,您可以在xml布局中将
TextView
类替换为my
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操作系统开发人员也承认这一点

不要更改支持文本选择的文本的移动方法,因为这将防止任意光标移动

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


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

你在做什么,但不起作用?尝试将其链接化只起作用吗?当我将其链接化时,我可以单击URL和电话。但当我将其设置为可选择时,再也不可能单击TextView.setMovementMethod(ArrowKeyMovementMethod.getInstance());是我需要让它为我工作的东西。将它与我自己的URLspan和其他自定义span混合使用,您的类工作得非常好。谢谢你提供它!顺便说一句,没有必要将其显式强制转换为ClickableLinksTextView,因为TextView api保持不变。非常感谢,它帮助了很多解决方案的工作。但是不要创建自定义的
TextView
,而是设置
Linkify.addLinks(mText,Linkify.ALL);mText.settextisselection(true);setMovementMethod(LinkMovementMethod.getInstance())并从
.xml
文件中删除相应的行。因此,它只是对先前准备好的
textView
(比如
textView=inflater.inflate(R.layout.linkify\u text\u view,null)
)进行充气,因为它在通过代码添加时无法正常工作。也检查一下这个