Как обрабатывать текстовые ссылки HTML в текущей деятельности - PullRequest
5 голосов
/ 14 сентября 2011

В моем пользовательском интерфейсе у меня есть список имен, которые я отображал, используя Html.fromHtml() из-за того, как имена должны быть выделены (см. Рис., Красные имена).

Под именами у меня естьScrollView (см. Рис, серый бит).Я хотел бы иметь возможность прокручивать определенную часть прокрутки при нажатии на имя.

enter image description here

Так что мне нужно решить несколько частей:

  1. Сделайте каждое имя кликабельным по отдельности
  2. Позвольте моей текущей активности обработать клик
  3. Не подчеркивайте имя

ИЛИ 4. Решите перенос текстамакет с использованием отдельных текстовых представлений

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

Спасибо заваше время.

Редактировать: Я нашел это Ссылка , но он использует намерение, поэтому оно не совсем то же самое, я не хочу, чтобы другое действие обрабатывало щелчоктолько текущий.

1 Ответ

10 голосов
/ 14 сентября 2011

Так я добавил действия onClick для определенных слов в текстовой строке.

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff">

    <TextView 
        android:id="@+id/mytextview1"
        android:textColor="#000000"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp" />

</LinearLayout>

Основная активность:

public class HtmlTextLinkTestActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TextView tv = (TextView) findViewById(R.id.mytextview1);
        tv.setText("Whale and Lion");

        clickify(tv, "Whale", new ClickSpan.OnClickListener() {
            @Override
            public void onClick() {
                Toast.makeText(HtmlTextLinkTestActivity.this, "Whale was clicked!", Toast.LENGTH_SHORT).show();
            }
        });

        clickify(tv, "Lion", new ClickSpan.OnClickListener() {
            @Override
            public void onClick() {
                Toast.makeText(HtmlTextLinkTestActivity.this, "Lion was clicked!", Toast.LENGTH_SHORT).show();
            }
        });
    }

    public static void clickify(TextView view, final String clickableText,  final ClickSpan.OnClickListener listener) {
        CharSequence text = view.getText();
        String string = text.toString();
        ClickSpan span = new ClickSpan(listener);

        int start = string.indexOf(clickableText);
        int end = start + clickableText.length();
        if (start == -1) return;

        if (text instanceof Spannable) {
            ((Spannable)text).setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            SpannableString s = SpannableString.valueOf(text);
            s.setSpan(span, start, end, Spanned.SPAN_MARK_MARK);
            view.setText(s);
        }

        MovementMethod m = view.getMovementMethod();
        if ((m == null) || !(m instanceof LinkMovementMethod)) {
            view.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }
}

class ClickSpan extends ClickableSpan {

    private OnClickListener mListener;

    public ClickSpan(OnClickListener listener) {
        mListener = listener;
    }

    @Override
    public void onClick(View widget) {
       if (mListener != null) mListener.onClick();
    }

    public interface OnClickListener {
        void onClick();
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setColor(0xff0000ff); // remove this if you don't want to want to override the textView's color if you specified it in main.xml
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...