Android Linkify 电话号码 - 如何指定要链接的号码和不链接的号码

Posted

技术标签:

【中文标题】Android Linkify 电话号码 - 如何指定要链接的号码和不链接的号码【英文标题】:Android Linkify Phone Numbers - how to specify which numbers to link and which not to 【发布时间】:2021-01-25 06:56:50 【问题描述】:

我正在用 Java 编写一个 android 应用程序,它显示与西班牙有关的信息,包括电话号码。

我正在使用 Linkify 使这些电话号码在使用此代码显示时可链接

Linkify.addLinks(textViewPlaceNotesDetailView, Linkify.PHONE_NUMBERS);

这很好用。

我的问题是其他数字也显示为链接,即。就像 1965 年一样。

如何防止这种情况发生?我只希望电话号码成为链接。

注意。我想为号码指定最小长度,在本例中为 9(西班牙电话号码为 9 位,格式为“xxx xxx xxx”)。但我一直无法弄清楚如何做到这一点。

【问题讨论】:

试过这个吗? ***.com/questions/27927930/… @Sajjad 感谢您的建议,我看到了这个问题,但对我没有帮助。我的链接适用于电话号码,我想阻止它们适用于其他号码。该问题中的信息似乎也已过时。 【参考方案1】:

您可以使用自定义regex 来链接电话号码。

 tv.setLinksClickable(true);
 //only find phone number
 //Pattern phoneNumberPattern = Pattern.compile("\\d3\\s\\d3\\s\\d3");
 //find phone number or web url
 Pattern phoneNumberPattern = Pattern.compile("(\\d3\\s\\d3\\s\\d3)|((https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|])");
 Linkify.addLinks(tv, phoneNumberPattern,"");

提供的regex 正在检测适用于您的情况的 xxx xxx xxx 数字格式和网址。

【讨论】:

感谢@Sajjad,我已经实现了以下功能,但我的电话号码现在不是链接:textViewPlaceNotesDetailView.setLinksClickable(true); Pattern phoneNumberPattern = Pattern.compile("\\s?(?:6[0-9]|7[1-9]|8[1-9]|9[1-9])[0-9]\\s?[0-9]3\\s?[0-9]3$"); Linkify.addLinks(textViewPlaceNotesDetailView, phoneNumberPattern,"");;我需要在 TextView 中使用一些特定的 XML 格式吗_ 好吧,显然你必须使用正确的正则表达式。我更新了我的答案并使用了另一个正则表达式。试试吧! @GearóidóCeallaigh 太好了,以上内容非常适合电话号码和年份。但是,如果我在它之后添加Linkify.addLinks(textViewPlaceNotesDetailView, Linkify.WEB_URLS); 以链接网址,那么我的电话号码不再是链接。如何将两者结合起来? 添加了正则表达式以查找电话号码和网络 URL。您可以通过一些搜索自己找到它。 @GearóidóCeallaigh 编辑您的问题标题并将“Web urls”添加到您问题的标题和正文中。【参考方案2】:

改用 LinkifyCompat 似乎已经解决了这个问题。

我现在使用的代码是:

LinkifyCompat.addLinks(textViewPlaceNotesDetailView, Linkify.PHONE_NUMBERS | Linkify.WEB_URLS);

这适用于(西班牙语)电话号码和网址。

我很确定这在我第一次尝试时并没有解决问题,但从那以后我已经更新为使用最新的依赖项并且它现在可以工作了。

我不知道哪个库处理这个问题,但我的依赖项现在看起来像这样:

implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'org.osmdroid:osmdroid-android:6.1.7'
implementation 'org.osmdroid:osmdroid-shape:6.1.6'
implementation 'com.google.android.gms:play-services-location:18.0.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.navigation:navigation-fragment:2.3.4'
implementation 'androidx.navigation:navigation-ui:2.3.4'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation files('libs/commons-net-3.3.jar')
implementation 'com.android.support:design'

【讨论】:

以上是关于Android Linkify 电话号码 - 如何指定要链接的号码和不链接的号码的主要内容,如果未能解决你的问题,请参考以下文章

Linkify.addLinks(textView、Linkify.WEB_URLS 或 Linkify.EMAIL_ADDRESSES)不能在 Android 中一起使用

java 添加指向TextView的链接。 Linkify。字体:https://stackoverflow.com/questions/4746293/android-linkify-textvie

如何从linkify textview获取url

设置自动链接的最小长度

我需要从我的 android 应用程序中拨打电话号码吗?从下面哪一个如果有效

Android TextView 启用 LinkiFy 和 Href 标签