Linkify は優れたクラスです。URL や電話番号などの複雑なパターンを探して、それらを URLSpans に変換します。既存の正規表現を書き直すのではなく、URLSpan クラスを拡張し、電話の URLSpanのみを確認ダイアログ付きのカスタム URLSpan にアップグレードするメソッドを作成しました。
まず、私の拡張 URLSpan クラス、ConfirmSpan:
class ConfirmSpan extends URLSpan {
AlertDialog dialog;
View mView;
public ConfirmSpan(URLSpan span) {
super(span.getURL());
}
@Override
public void onClick(View widget) {
mView = widget;
if(dialog == null) {
AlertDialog.Builder mBuilder = new AlertDialog.Builder(widget.getContext());
mBuilder.setMessage("Do you want to call: " + getURL().substring(4) + "?");
mBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
})
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
openURL();
}
});
dialog = mBuilder.create();
}
dialog.show();
}
public void openURL() {
super.onClick(mView);
}
}
次に、さまざまなスパン クラスを交換する方法を示します。
private void swapSpans(TextView textView) {
Spannable spannable = (Spannable) textView.getText();
URLSpan[] spans = textView.getUrls();
for(URLSpan span : spans) {
if(span.getURL().toString().startsWith("tel:")) {
spannable.setSpan(new ConfirmSpan(span), spannable.getSpanStart(span), spannable.getSpanEnd(span), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.removeSpan(span);
}
}
}
最後に、autoLink 属性を使用して TextView を作成するだけです。
android:autoLink="phone"
そして、swapSpans()
メソッドを呼び出すことを忘れないでください。楽しみのためにこれを書いたことを理解してください。これを行う他の方法があるかもしれませんが、現時点では知りません。お役に立てれば!