23

有什么方法可以从字符串的一部分启动活动。

例如,我的 strings.xml 文件中有这个:

<string name="clickable_string">This is a <u>clickable string</u></string>

我希望u标签之间的文本带有下划线,并在插入到TextView

4

3 回答 3

43

尝试这个,

final Context context = ... // whereever your context is
CharSequence sequence = Html.fromSource(context.getString(R.string.clickable_string));
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
UnderlineSpan[] underlines = strBuilder.getSpans(UnderlineSpan.class);
for(UnderlineSpan span : underlines) {
   int start = strBuilder.getSpanStart(span);
   int end = strBuilder.getSpanEnd(span);
   int flags = strBuilder.getSpanFlags(span);
   ClickableSpan myActivityLauncher = new ClickableSpan() {
     public void onClick(View view) {
       context.startActivity(getIntentForActivityToStart());
     }
   };

   strBuilder.setSpan(myActivityLauncher, start, end, flags);
}

TextView textView = ...
textView.setText(strBuilder);
textView.setMovementMethod(LinkMovementMethod.getInstance());

基本上,您必须将 Span 对象附加到您希望可点击的字符范围。由于您无论如何都在使用 HTML,因此您可以使用 Html.fromSource() 放置的下划线跨度作为您自己的跨度的标记。

或者,您也可以在只有您知道的字符串中定义一个标签。即<activity> 并将您自己的标记处理程序提供给 Html.fromSource() 方法。这样,您的 TagHandler 实例可以执行类似的操作,用特定颜色、下划线、粗体围绕标记文本并使其可点击。但是,如果您发现自己经常编写此类代码,我只会推荐 TagHandler 方法。

于 2010-10-26T17:37:08.043 回答
2

在这里回答使部分 textview 可点击(不是 url) 如果您想将它与 HTML 消息一起使用,我刚刚进行了修改,请在您的显示功能中执行以下操作

public void displayText(String message) {

            chapterTextView.setText(Html.fromHtml(message),TextView.BufferType.SPANNABLE);
            chapterTextView.setMovementMethod(LinkMovementMethod.getInstance());
            Spannable clickableMessage = (Spannable) chapterTextView.getText();
            chapterTextView.setText(addClickablePart(clickableMessage), BufferType.SPANNABLE);
}

addClickablePart的修改功能

private SpannableStringBuilder  addClickablePart(Spannable charSequence) {
        SpannableStringBuilder  ssb = new SpannableStringBuilder(charSequence);

        int idx1 = charSequence.toString().indexOf("(");
        int idx2 = 0;
        while (idx1 != -1) {
            idx2 = charSequence.toString().indexOf(")", idx1) + 1;

            final String clickString = charSequence.toString().substring(idx1, idx2);
            ssb.setSpan(new ClickableSpan() {

                @Override
                public void onClick(View widget) {
                    Toast.makeText(getActivity(), clickString,
                            Toast.LENGTH_SHORT).show();
                }
            }, idx1, idx2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            idx1 = charSequence.toString().indexOf("(", idx2);
        }

        return ssb;
    }

希望这对某人有所帮助。

于 2014-08-04T23:21:27.983 回答
2

将此字符串分配给您的 xml 布局之一,然后在您的代码中获取 TextView 的 id,然后为此 Textview 实现 OnClickListener,在其中您可以开始您想要的新活动。

于 2010-10-26T16:58:18.623 回答