Сайт разработчика Александр Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Класс Linkify

Linkify — вспомогательный класс, который автоматически создает гиперссылки внутри элементов TextView (и их производных) на основе регулярных выражений RegEx.

Текст, соответствующий заданному регулярному выражению, будет преобразован в гиперссылку, при нажатии которой срабатывает код вида startActivity (new Intent(Intent.ACTION_VIEW, uri)), где uri — совпавший текст.

Вы можете задать шаблон строк, которые хотите превратить в ссылки. Для удобства класс Linkify предлагает предустановленные шаблоны для часто встречающихся типов содержимого (таких как телефонные номера или адреса электронной почты).

Стандартные типы ссылок в 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);
Большинство устройств под управлением Android включают как минимум два почтовых приложения: Gmail и Email. Если для выполнения действия подходят сразу несколько активностей, пользователю будет предложено выбрать между ними.

Вы также можете применить класс 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

Чтобы описать собственный шаблон для 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());

Использование интерфейса MatchFilter

Реализуйте метод 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

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)