Как убрать подчеркивания в TextView и реагировать на клики
У меня есть многострочное TextView с контактами (номер телефона, электронная почта, URL). Я хочу нажать на любую строку и открыть соответствующее приложение (телефон, почтовый клиент, браузер). Я перепробовал много решений, но все они содержат ошибки.
1. Если использовать
<TextView
android:id="@+id/text"
android:text="abcdfgf@def.com"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="all" />
тогда текст подчеркнут. Следуя темам ( удаление подчеркивания из ссылок в TextView - Android), которые удаляют подчеркивания, я получаю неработающие клики.
2. Если я использую ClickableSpan, то хочу, но хочу, но после того, как менеджер телефона, браузер или почтовый клиент открывается, закрывается и MainActivity воссоздается, TextView
становится неактивным (см. картинки). MainActivity воссоздается, потому что я установил флаг для уничтожения действий, когда они не видны в настройках эмулятора разработчика.
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:linksClickable="true"
android:text="abcdefgh@def.com" />
Основная деятельность:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView textView = findViewById(R.id.text);
String text = "Hello World!\n+7 900 1234567\nabc@def.com\nhttp://yandex.ru";
final List<String> items = Arrays.asList(text.split("\n"));
SpannableString ss = new SpannableString(text);
int start = 0, end;
for (String item : items) {
end = start + item.length();
// ss.removeSpan(span);
if (start < end) {
ss.setSpan(new MyClickableSpan(item), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
start += item.length() + 1;//comma and space in the original text ;)
}
textView.setText(ss, TextView.BufferType.SPANNABLE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(ss, TextView.BufferType.SPANNABLE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
private static class MyClickableSpan extends ClickableSpan {
private final String text;
private MyClickableSpan(final String text) {
this.text = text;
}
@Override
public void onClick(final View widget) {
if (text.startsWith("+")) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + text));
widget.getContext().startActivity(intent);
} else if (text.contains("@")) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_EMAIL, text);
intent.putExtra(Intent.EXTRA_CC, "");
intent.putExtra(Intent.EXTRA_BCC, "");
intent.putExtra(Intent.EXTRA_SUBJECT, "Playlist Details");
// intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(Detail));
intent.setType("text/html");
widget.getContext().startActivity(Intent.createChooser(intent, "Send Email Using: "));
} else if (text.startsWith("http")) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(text));
widget.getContext().startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(widget.getContext(), "Web browser is not installed", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
}
TextView
прежде чем нажать на любой элемент.
TextView
после возврата из браузера.
Как создать TextView
как на картинке 1 и реагировать на клики?