Вот мое расследование.
Я создал новый проект и добавил android:autoLink="all"
в текстовое изображение в activity_main.xml
. Поблагодарив за вклад разработчика Android Studio, я мог видеть предварительный просмотр. И я нашел что-то необычное.
12345
не связан
123456
не связаны
1234567
связанных
12345678
связанных
123456789
не связан
1234567890
не likned
12345678901
связаны
123456789012
не связаны
Может быть, это diffent на моем телефоне, но это был тот же самый результат выше. Поэтому я заглянул в исходный файл, обыскал keywork autolink, тогда я нашел это.
private void setText(CharSequence text, BufferType type,
boolean notifyBefore, int oldlen) {
...
// unconcerned code above
if (mAutoLinkMask != 0) {
Spannable s2;
if (type == BufferType.EDITABLE || text instanceof Spannable) {
s2 = (Spannable) text;
} else {
s2 = mSpannableFactory.newSpannable(text);
}
if (Linkify.addLinks(s2, mAutoLinkMask)) {
text = s2;
type = (type == BufferType.EDITABLE) ? BufferType.EDITABLE : BufferType.SPANNABLE;
/*
* We must go ahead and set the text before changing the
* movement method, because setMovementMethod() may call
* setText() again to try to upgrade the buffer type.
*/
mText = text;
// Do not change the movement method for text that support text selection as it
// would prevent an arbitrary cursor displacement.
if (mLinksClickable && !textCanBeSelected()) {
setMovementMethod(LinkMovementMethod.getInstance());
}
}
}
...
// unconcerned code above
}
Так что ключевое слово Linkify
прямо сейчас. Для addLinks
:
public static final boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask) {
...
if ((mask & PHONE_NUMBERS) != 0) {
gatherTelLinks(links, text);
}
...
}
private static final void gatherTelLinks(ArrayList<LinkSpec> links, Spannable s) {
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
Iterable<PhoneNumberMatch> matches = phoneUtil.findNumbers(s.toString(),
Locale.getDefault().getCountry(), Leniency.POSSIBLE, Long.MAX_VALUE);
for (PhoneNumberMatch match : matches) {
LinkSpec spec = new LinkSpec();
spec.url = "tel:" + PhoneNumberUtils.normalizeNumber(match.rawString());
spec.start = match.start();
spec.end = match.end();
links.add(spec);
}
}
Тогда что-то плохое случилось, то SDK не PhoneNumberUtil
, а именно эти три класса ниже.
import com.android.i18n.phonenumbers.PhoneNumberMatch;
import com.android.i18n.phonenumbers.PhoneNumberUtil;
import com.android.i18n.phonenumbers.PhoneNumberUtil.Leniency;
В настоящем время, первая причина, всплыла: Locale.getDefault().getCountry()
Так что я пошел в настройки, нашли язык, выбранный китайскую. Результат ниже.
12345
связанные между собой
123456
связаны
1234567
связаны
12345678
связаны
123456789
связаны
1234567890
связанные между собой
12345678901
связаны
123456789012
связаны
Во-вторых, для упаковки com.android.i18n.phonenumbers
, я нашел это.
https://android.googlesource.com/platform/external/libphonenumber/+/ics-factoryrom-2-release/java/src/com/android/i18n/phonenumbers
Если вас заинтересовало данное предложение, перейдите по ссылке выше. Но позаботьтесь о самой ссылке, ics-factoryrom-2-release
. Поэтому я очень сомневаюсь, что это Платформа-зависимая.
Для решения, @CleverAndroid является правильным, полный контроль над LinkMovementMethod
является хорошим вариантом.
Почему? android: autoLink = «телефон» тоже должен работать. И он работает на некоторых устройствах. И это не вопрос. –