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

Android:从可点击文本启动活动,android,text,hyperlink,launch,Android,Text,Hyperlink,Launch,是否有任何方法可以从字符串的一部分启动活动 乙二醇 我的strings.xml文件中有: <string name="clickable_string">This is a <u>clickable string</u></string> 这是一个可单击的字符串 我希望u标记之间的文本加下划线,并在插入TextView时单击启动活动,将此字符串分配给一个xml布局,然后在代码中获取TextView的id,然后为此TextView实现OnClic

是否有任何方法可以从字符串的一部分启动活动

乙二醇 我的strings.xml文件中有:

<string name="clickable_string">This is a <u>clickable string</u></string>
这是一个可单击的字符串

我希望
u
标记之间的文本加下划线,并在插入
TextView

时单击启动活动,将此字符串分配给一个xml布局,然后在代码中获取TextView的id,然后为此TextView实现OnClickListener,在它里面,你可以开始你想要的新活动。

试试这个

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

或者,您也可以在字符串中定义一个只有您知道的标记。 i、 e.
并为Html.fromSource()方法提供您自己的标记处理程序。通过这种方式,您的TagHandler实例可以执行以下操作:用特定颜色、下划线、粗体环绕标记的文本,并使其可单击。但是,如果您发现自己经常编写这种类型的代码,我只推荐使用TagHandler方法。

回答如下 我只是做了一个修改,如果你想在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;
    }

希望这对其他人有所帮助。

问题是我只希望标签中的文本可以单击。我已经简化了这个问题,但这是一个要求。基本上,我希望它像一个HTML链接标签,但不是一个网页,它启动一个活动。这是真棒。但是有一件事,如果我使用getString获取字符串,它就不起作用了:(.我现在只是在代码中硬编码了字符串..是的。另外如果你想将链接颜色设置为白色:textView.setLinkTextColor(android.R.color.white);嗨,Kabal,不管使用getString()还是getText(),它都会起作用。通过使用Html.fromSource(string)它将创建一个Spanable,将html标记转换为spans,供android的文本渲染器处理。如果您认为您可能正在处理某个特定问题,请弹出一个后续问题。您好,太棒了!如何单击字符串?我有多个字符串可单击(下划线)通过textView?任何帮助?您可以创建一个ClickableSpan,并将其与您想要单击的字符串中的字符相关联。类似于上面的下划线span解决方案。