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" />
我已经在我的代码上试了一下,我可以打电话/浏览网页/邮件,也可以选择所有文本。
autoLink
属性有一个恼人的错误:如果你点击你的电话号码示例,然后返回并点击第二个url链接 - 它会再次打开电话号码。 这个属性对于多个链接来说非常糟糕,我已经实现了我自己的类,这里是Github ClickableLinksTextView.java上的链接
在你的例子中,你可以用xml-layout中的ClickableLinksTextView
类替换TextView
类,并像下面这样更改代码:
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操作系统开发人员都在Android操作系统源代码中承认这一点。
不要更改支持文本选择的文本的移动方法,因为它可以防止任意光标位移。
如果文本视图是可选的,则只有2个正确的移动方法值为null
和ArrowKeyMovementMethod
。 这就是为什么我在我的示例中明确地设置了ArrowKeyMovementMethod
,因为Linkify.addLinks
设置了不正确的移动方法,我应该恢复它。
至于autoLink属性的错误,这是因为android开发者没有正确地复制链接检测。 您可以在@cheng yang的答案中查看代码示例,无论您拥有多少个代码,代码都只需要第一个链接。
问题出在Android的TextView
。 调用Linkify.addLinks()
不会改变TextView
本身的自动Linkify.addLinks()
。 我认为这是一个Android错误,他们检查mAutoLinkMask。 因此,如果您在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;
}
}
链接地址: http://www.djcxy.com/p/74631.html