如何处理当前活动中的HTML文本链接

C0d*_*ack 5 android android-layout

在我的UI中,Html.fromHtml()由于名称应突出显示的方式,我有一个显示的名称列表(参见图片,红色名称).

在名称下我有一个ScrollView(见图片,灰色位).我希望能够在按下名称时滚动到scrollview的某个部分.

在此输入图像描述

所以我有几件要解决的问题:

  1. 使每个名称单独点击
  2. 让我当前的活动处理点击
  3. 没有强调这个名字

或4.使用单个文本视图解决文本环绕布局

我知道最好的办法是为每个名字创建单独的文本视图,但如果我这样做,我会丢失文本包装,如图所示.

谢谢你的时间.

编辑:我发现这个链接,但它使用了一个意图,所以它不完全相同,我不希望另一个活动来处理点击,只是当前的一个.

C0d*_*ack 10

这就是我将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>
Run Code Online (Sandbox Code Playgroud)

主要活动:

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
    }
}
Run Code Online (Sandbox Code Playgroud)