Как добавить действие click для ImageSpan

У меня есть ImageSpan, установленный в TextEdit. И я хочу добавить действие - когда пользователь нажимает на ImageSpan, он выворачивает диалог и показывает большое изображение.

Я проверил SDK и кажется, что ImageSpan не поддерживает onclick. Есть ли способ включить onclick для ImageSpan или другого Span, который поддерживает Image?

Я проверил код и обнаружил, что есть URLSpan, созданный с помощью ImageSpan, потому что входная строка

Но похоже, что URLSpan не работает и для него нет действия click. Любая идея?

Спасибо.

Ответы

Ответ 1

Я пытался решить ту же проблему сегодня и найти решение. Чтобы сделать изображение кликабельным, вам нужно прикрепить объект ClickableSpan к тому же диапазону, что и ImageSpan для вашего изображения. Когда вы получите свой Spanned объект из Html.fromHtml(), вы можете пройти через набор объектов ImageSpan, назначенных для него, и прикрепить дополнительный объект ClickableSpan.

Вот так:

            ImageSpan[] image_spans = s.getSpans(0, s.length(), ImageSpan.class);

            for (ImageSpan span : image_spans) {

                final String image_src = span.getSource();
                final int start = s.getSpanStart(span);
                final int end = s.getSpanEnd(span);

                ClickableSpan click_span = new ClickableSpan() {

                    @Override
                    public void onClick(View widget) {

                        Toast.makeText(HtmlImagesTestActivity.this,
                                "Image Clicked " + image_src,
                                Toast.LENGTH_SHORT).show();

                    }

                };

                ClickableSpan[] click_spans = s.getSpans(start, end, ClickableSpan.class);

                if(click_spans.length != 0) {

                    // remove all click spans

                    for(ClickableSpan c_span : click_spans) {
                        s.removeSpan(c_span);
                    }


                }


                s.setSpan(click_span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

            }               

Ответ 2

Я нашел ключевой момент. Чтобы ответить на действие click, мы не только устанавливаем clickablespan, но также устанавливаем edittext'setMovementMethod, код выглядит следующим образом:

EditText.setMovementMethod(LinkMovementMethod.getInstance());

Вот проблема. Если установить setMovementMethod в LinkMovementMethod.getInstance(), курсор edittext исчезнет. Я не знаю, почему

Ответ 3

Сначала сделайте область кликабельной из свойств.
Затем добавьте OnClickListner для этого.

Сделайте свое собственное действие методом onclick.

Ответ 4

Вы можете проверить, используя ClickableSpan и прикрепить TextView к LinkMovementMethod и переопределить его onTouchEvent и т.д.

Надеюсь, что поможет

Ответ 5

после ответа miaohua1982 выше, ясно, что курсор отключается после установки метода setmovementModeODMode. Я столкнулся с аналогичной проблемой в текстовом режиме, где режим действия (который появится в LongPress textview) отменяется, и я не получаю никаких элементов действия. Я решил эту проблему, расширив LinkMovementMethod и переопределив метод, как показано ниже. Я надеюсь, что даже в editext он решает проблему.

class MyMovementMethod extends LinkMovementMethod{

 @Override
  public boolean canSelectArbitrarily() {
       return true;
    }    

}