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 に答える