/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Linkify — вспомогательный класс, который автоматически создает гиперссылки внутри элементов TextView (и их производных) на основе регулярных выражений RegEx.
Текст, соответствующий заданному регулярному выражению, будет преобразован в гиперссылку, при нажатии которой срабатывает код вида startActivity (new Intent(Intent.ACTION_VIEW, uri)), где uri — совпавший текст.
Вы можете задать шаблон строк, которые хотите превратить в ссылки. Для удобства класс Linkify предлагает предустановленные шаблоны для часто встречающихся типов содержимого (таких как телефонные номера или адреса электронной почты).
Статический метод Linkify.addLinks() в качестве параметров принимает представление, к которому будут применены шаблоны, а также битовые маски для одного или нескольких стандартных типов содержимого, предоставляемые классом Linkify: WEB_URLS, EMAIL_ADDRESSES, PHONE_NUMBERS и ALL.
В листинге показано, как с помощью класса Linkify отобразить адреса веб-сайтов и электронной почты, содержащихся в элементе TextView, в виде гиперссылок. При нажатии ссылки откроются браузер и почтовый клиент соответственно.
TextView textView = (TextView) findViewById(R.id.myTextView);
Linkify.addLinks(textView, Linkify.WEB_URLS|Linkify.EMAIL_ADDRESSES);
Вы также можете применить класс Linkify к представлению прямо внутри ресурса с разметкой, используя атрибут android:autoLink. Он поддерживает одно или несколько значений (разделенных символом |): none, web, email, phone и all.
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/linkify_me"
android:autoLink="phone|email"
/>
Чтобы описать собственный шаблон для Linkify, необходимо создать новое регулярное выражение RegEx, соответствующее тексту, который вы хотите отобразить в виде ссылки.
Как и в случае со стандартными типами, применять Linkify к представлению можно с помощью метода Linkify.addLinks(), но вместо константы необходимо передать новое регулярное выражение RegEx. Вы также можете передать префикс, который будет добавлен к целевому пути URI после нажатия ссылки.
Ниже показано, как применить Linkify к представлению для добавления поддержки данных о землетрясениях, предоставляемых с помощью Источника данных. Чтобы не добавлять всю схему, шаблон для Linkify считает за совпадение любой текст, начинающийся со строки quake, за которым следует номер. Потом схема добавляется в начало пути URI, прежде чем сработает Намерение.
int flags = Pattern.CASE_INSENSITIVE;
Pattern p = Pattern.compile("\\bquake[0-9]*\\b", flags);
Linkify.addLinks(myTextView, p,
"content://com.paad.earthquake/earthquakes/");
Linkify также поддерживает интерфейсы TransformFilter и MatchFilter, что позволяет установить дополнительный контроль над структурой целевого пути URI и описание регулярного выражения. Пример использования этих интерфейсов представлен в следующем фрагменте кода:
Linkify.addLinks(myTextView, pattern, prefixWith,
new MyMatchFilter(), new MyTransformFilter());
Реализуйте метод acceptMatch() в своем классе, который унаследован от MatchFilter, чтобы добавить дополнительные условия в регулярное выражение. Метод acceptMatch() срабатывает при нахождении потенциального совпадения, принимая в качестве параметров начальный и конечный индексы (вместе с полной искомой строкой).
В листинге показана реализация интерфейса MatchFilter, которая отменяет любое совпадение, если перед найденной строкой находится знак восклицания.
class MyMatchFilter implements MatchFilter {
public boolean acceptMatch(CharSequence s, int start, int end) {
return (start == 0 || s.charAt(start - 1) != '!');
}
}
TransformFilter дает больше свободы для форматирования текстовых строк, изменения внешнего вида генерируемых ссылок. Отделение текста ссылки от целевого пути URI позволяет менять способ вывода текстовых данных на экраны.
Чтобы задействовать интерфейс TransformFilter, необходимо переопределить метод transformUrl. Он начнет вызываться при нахождении совпадения. В качестве параметров он принимает регулярное выражение и строку URI, которую должен создать. Вы можете изменить совпавшую строку и вернуть путь URI в качестве цели, подходящей для отображения с помощью другой программы.
Реализация интерфейса TransformFilter, приведенная в листинге ниже, преобразует совпавшую строку в путь URI, возвращаемый в нижнем регистре.
class MyTransformFilter implements TransformFilter {
public String transformUrl(Matcher match, String url) {
return url.toLowerCase();
}
}
Android 2. Программирование приложений для планшетных компьютеров и смартфонов (Заказать на Ozon.ru)