1

我在同一个 TextView 中有电话号码和地址(包括邮政编码)。我希望电话号码可以点击拨打;但是,这使得邮政编码也可以单击以拨打电话。如何在不创建另一个 TextView 的情况下使其不再可点击?谢谢!

tvInfo.setText(Html.fromHtml("John Smith<br>123 Fake Street<br>Faketown, FK 12345<br><b>(804) 932-3300</b><br>"));

Linkify.addLinks(tvInfo, Linkify.PHONE_NUMBERS);
4

1 回答 1

1

android 会将 count >=5 的数字视为电话号码。所以我认为至少会有2个解决方案:

1)一个简单的解决方法:如果您确定电话号码的长度超过 5 个,例如,至少 6 位,您可以解决一些问题:

private final static int MY_PHONE_NUMBER_MINIMUM_DIGITS = 6;

Linkify.addLinks(main, Patterns.PHONE, "tel:", new Linkify.MatchFilter() {
     public final boolean acceptMatch(CharSequence s, int start, int end) {
       int digitCount = 0;

       for (int i = start; i < end; i++) {
         if (Character.isDigit(s.charAt(i))) {
           digitCount++;
           if (digitCount >= MY_PHONE_NUMBER_MINIMUM_DIGITS ) {
             return true;
         }
       }
     }
      return false;
    }
  }, Linkify.sPhoneNumberTransformFilter);

这个变通方法是基于Linkify的android源码,在Linkify中,方法:

gatherLinks(links, text, Patterns.PHONE, 
            new String[] { "tel:" },
            sPhoneNumberMatchFilter, sPhoneNumberTransformFilter); 

将被调用,而 sPhoneNumberMatchFilter 将过滤小于 5 的数字:

public static final MatchFilter sPhoneNumberMatchFilter = new MatchFilter() {
    public final boolean acceptMatch(CharSequence s, int start, int end) {
      int digitCount = 0;

      for (int i = start; i < end; i++) {
        if (Character.isDigit(s.charAt(i))) {
          digitCount++;
          if (digitCount >= PHONE_NUMBER_MINIMUM_DIGITS/*=5*/) {
            return true;
        }
      }
    }
    return false;
 }

};

所以我们只需将“PHONE_NUMBER_MINIMUM_DIGITS”替换为 6

2)一个更复杂的解决方案是,如果您的电话号码是更具体的格式,例如,必须是“(xxx)xxx-xxxx”,您可以使用自己的模式替换Patterns.PHONE,提取和更准确地应用电话号码的链接

于 2013-01-15T04:03:06.820 回答