Android: добавьте «внутренние» ссылки на часть TextView, которая ссылается на действие в моем коде - PullRequest
6 голосов
/ 21 января 2012

Как видно из названия, я хотел бы добавить ссылки на мой TextView с этими двумя оговорками:

  • Я хочу, чтобы ссылка действовала на часть TextView, а не на полную (что-то вроде A якоря в HTML).

  • Я хочу, чтобы ссылка указывала на действие в моем коде, а не на веб-сайте. Я мог бы определить метод в своей деятельности или реализовать OnClickListener и выполнить его при нажатии на эту конкретную ссылку.

До сих пор мне удалось превратить номера телефонов, адреса, веб-сайты и электронные письма в выделенные внешние ссылки, используя:

Linkify.addLinks(message, Linkify.ALL);

Мне бы хотелось что-то подобное для внутренних ссылок (для моего метода) с возможностью определения пользовательских.

Кроме того, использование веб-страницы с внутренней ссылкой и веб-представлением на самом деле не вариант, поскольку у меня уже есть несколько сложных макетов, и мне было бы довольно сложно изменить все приложение и концепции ...

Есть идеи?

РЕДАКТИРОВАТЬ: Кабуко дал мне очень хорошее решение, вот как я его реализовал:

final TextView descriptionTextView = (TextView) findViewById(R.id.description);
final Spannable span = Spannable.Factory.getInstance().newSpannable("the full text for the view");
span.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        Toast.makeText(StartEventActivity.this, "LINK CLICKED", Toast.LENGTH_SHORT).show();
    }
}, 1, 20, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 1 and 20 to be replaced with actual index of start and end of the desired link
descriptionTextView.setText(span);
descriptionTextView.setMovementMethod(LinkMovementMethod.getInstance());

Ответы [ 2 ]

5 голосов
/ 21 января 2012

Если вы хотите перейти к URL-адресам, вы можете использовать Html.fromHtml, но если вам нужны собственные обработчики кликов, вы можете использовать ClickableSpan.

0 голосов
/ 14 сентября 2016

В завершении предыдущего поста это может помочь кому-то

        TextView textView = (TextView) getView().findViewById(R.id.textView);
        textView.setText(Html.fromHtml(getString(R.string.html_)) , TextView.BufferType.SPANNABLE);

        String tmp = ((Spannable) textView.getText()).toString();
        String linkText = getString(R.string.html_link);
        int index = tmp.indexOf(linkText);

        if(index>=0) {
            Spannable spannable = (Spannable) textView.getText() ;
            spannable.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    try {
                        /// do what you must

                    }catch (Exception ex){
                        handleException(ex);
                    }
                }
            }, index, index+getString(R.string.html_link).length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            textView.setText(spannable);
            textView.setMovementMethod(LinkMovementMethod.getInstance());
        }
...