Кликабельная ссылка в TextView с прикрепленным к нему контекстным меню - PullRequest
0 голосов
/ 09 января 2011

У меня есть адаптер списка, который обрабатывает объекты с некоторыми изображениями и текстом, и я хочу:

  • отображать контекстное меню, отображаемое при длительном щелчке по всему элементу списка
  • начать какое-то действие при нажатии на изображение
  • обрабатывать клики по ссылкам внутри TextView (сейчас просто отображается сообщение Toast)

Это моя текущая реализация адаптера:

public class StatusAdapter extends ArrayAdapter<BlipStatus> {

    @Override
    public View getView(final int pos, final View convertView, final ViewGroup parent) {
        // snip...
        final Status status = statuses.get(pos);
        // snip...
        final View s = v.findViewById(R.id.status);
        if (!(s instanceof TextView)) throw new RuntimeException("Expected textView instance");
        TextView stv = (TextView) s;
        stv.setText(prepareStatusContent(status.getBody()));
        stv.setLinksClickable(true);
        stv.setMovementMethod(LinkMovementMethod.getInstance());

        // snip...

        final View a = v.findViewById(R.id.avatar);
        if (!(a instanceof ImageView)) throw new RuntimeException("Expected imageView instance");
        String p = status.getAvatarPath();
        try {
            ((ImageView) a).setImageBitmap(AvatarUtils.getAvatarFromPath(p));
        } catch (IOException e) {
            Log.w(TAG, "Failed to fetch avatar from path : " + p);
        }

        a.setOnClickListener(new View.OnClickListener() {
            public void onClick(final View view) {
                final Context c = getContext();
                final Intent i = new Intent(c, UserActivity.class);
                i.putExtra(UserActivity.USER_NAME, status.getUser());
                c.startActivity(i);
            }
        });

        return v;
    }

    private CharSequence prepareStatusContent(String s) {
        SpannableString ss = new SpannableString(s);
        Pattern p = Pattern.compile(URL_PATTERN);
        Matcher m = p.matcher(s);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            final String url = s.substring(start, end);
            ss.setSpan(new ExternalUrlSpan(new View.OnClickListener() {
                public void onClick(View view) {
                    Toast.makeText(getContext(), url, Toast.LENGTH_LONG);
                }
            }), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return ss;
    }
}

и класс ExternalUrlSpan:

public class ExternalUrlSpan extends ClickableSpan {
    private final View.OnClickListener listener;

    public ExternalUrlSpan(View.OnClickListener listener) {
        super();
        this.listener = listener;
    }

    @Override
    public void onClick(View view) {
        listener.onClick(view);
    }
}

Дополнительно я звоню

registerForContextMenu()

метод с экземпляром ListView, использующий мой адаптер в качестве параметра в коде активности.

В результате у меня есть список, отображающий элементы с кликабельным изображением, которое запускает некоторые действия, как ожидалось, и контекстное меню, доступное после долгого нажатия на элемент. Но когда я пытаюсь щелкнуть ссылку в текстовом представлении элемента списка, она попадает, но все событие щелчка обрабатывается слушателем, связанным с контекстным меню, и.

Кто-нибудь знает, как заставить это работать вообще?

1 Ответ

0 голосов
/ 11 января 2011

Это было глупо. Забыл вызвать метод show () в сообщении Toast

Toast.makeText(getContext(), url, Toast.LENGTH_LONG).show();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...