Как убрать подчеркивания в 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 и реагировать на клики?

0 ответов

Другие вопросы по тегам