Android:从可点击文本启动活动

24

有没有办法从字符串的一部分启动一个Activity。

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

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

我想让插入在TextView中的u标签内的文本带有下划线,并且在被点击时启动一个活动。

3个回答

45

尝试这样做,

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()放置的下划线span作为自己的标记。

或者,您还可以在字符串中定义一个只有您知道的标记。 例如:<activity> 并提供自己的标签处理程序给Html.fromSource()方法。这种方法可以让您的TagHandler实例将标记文本用特定的颜色、下划线、加粗和可单击的方式包围起来。但是,如果您发现自己经常编写此类代码,则建议使用TagHandler方法。


1
这真是太棒了。不过有一个问题,如果我使用getString获取字符串不起作用 :(. 现在我只是在代码中硬编码字符串..耶。另外,如果你想将链接颜色设为白色:textView.setLinkTextColor(android.R.color.white); - tomwilson
嗨Kabal,无论使用getString()还是getText(),它都能正常工作。通过使用Html.fromSource(String),它将创建一个可跨度的对象,其中包含将HTML标记转换为Android文本渲染器处理的跨度。如果您认为可能会遇到特定问题,请弹出后续问题。 - Greg Giacovelli
你好,这很棒!我怎样才能获取被点击的字符串?我的textView下有多个可点击的字符串(带下划线),有什么帮助吗? - Angie
你可以创建一个 ClickableSpan 并将其关联到要可点击的字符串中的字符。与上面的 UnderlineSpan 解决方案类似。 - Greg Giacovelli

2

在这里回答:使TextView的部分文本可点击(非URL) 如果您想要将其用于HTML消息,则可以进行以下修改: 在您的Display函数中

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;
    }

希望这能帮到某些人。

2

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


问题在于我只想让标签内的文本可点击。我已经简化了问题,但这是一个要求。基本上,我希望它像HTML链接标记一样运作,但不是打开网页,而是启动一个活动。 - Martyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接