У меня есть текстовое представление, содержащее электронные письма, и я хочу, чтобы у вас есть возможность нажимать на них, чтобы запустить действие в моем собственном приложении. Я использую Linkify.addLinks(TextView, Linkify.EMAIL_ADDRESSES)
, чтобы сделать электронную почту доступной, однако это вызывает выбор, спрашивающий пользователя, какое приложение они хотели бы открыть. В нем я могу напрямую обрабатывать это событие, чтобы я мог указать, какую активность вызывается при нажатии на ссылка?Ручка Связать события onClick с собственными намерениями
ответ
Для этого вы можете использовать контент-провайдеры и фильтры намерений. Может потребоваться написать регулярное выражение для адреса электронной почты, а затем использовать его с помощью Linkify. Here - пример использования пользовательских регулярных выражений и поставщиков контента с помощью Linkify.
Один из способов сделать это - переопределить метод startActivity для деятельности, которой принадлежит TextView с Linkify. Затем проверьте Intent действие, которое должно быть ACTION_VIEW для Linkify Intent: ответ
@Override
public void startActivity(Intent intent) {
if (TextUtils.equals(intent.getAction(), Intent.ACTION_VIEW)) {
// Your code here
}
else {
super.startActivity(intent);
}
}
Карлоса работает хорошо, но я использую ACTION_VIEW
для внешних намерений я хочу начать, как хорошо. К счастью, Linkify добавляет идентификатор приложения в дополнение к намерению (для совместимости с браузером), который не добавляется в мои другие намерения, поэтому я использую следующую логику, чтобы убедиться, что я правильно обрабатываю намерения Linkify:
@Override
public void startActivity(Intent intent) {
boolean handled = false;
if (TextUtils.equals(intent.getAction(), Intent.ACTION_VIEW)) {
String app_id = intent.getStringExtra(Browser.EXTRA_APPLICATION_ID);
if (TextUtils.equals(getApplicationContext().getPackageName(), app_id))
{
// This intent is a view coming from Linkify; handle internally
// << do something smart here >>
handled = true;
}
}
if (!handled)
super.startActivity(intent);
}