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

Posted

技术标签:

【中文标题】Android:从可点击文本启动活动【英文标题】:Android: Launch activity from clickable text 【发布时间】:2011-04-30 20:37:15 【问题描述】:

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

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

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

我希望u 标记之间的文本带有下划线,并在插入TextView 时单击时启动一个活动

【问题讨论】:

【参考方案1】:

试试这个,

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

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

【讨论】:

这太棒了。不过有一件事,如果我使用 getString 获取字符串它不起作用:(。我现在只是在代码中硬编码字符串.. 是的。另外,如果你想将链接颜色设置为白色:textView.setLinkTextColor(android .R.color.white); 嗨 Kabal,无论使用 getString() 还是 getText(),它都可以正常工作。通过使用 Html.fromSource(String) 它将创建一个跨度,并将 html 标记转换为跨度,供 android 的文本渲染器处理。如果您认为您可能正在处理某个特定问题,请提出后续问题。 你好,太棒了!我怎样才能点击字符串?我有多个 textView 可点击的字符串(下划线)?有什么帮助吗? 您可以创建一个 ClickableSpan 并将其与您希望可点击的字符串中的字符相关联。类似于上面的 UnderlineSpan 解决方案。【参考方案2】:

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

【讨论】:

问题是我只希望标签内的文本是可点击的。我已经稍微简化了这个问题,但这是一个要求。基本上我希望它像 HTML 链接标签一样,但它不是网页,而是启动一个活动。【参考方案3】:

在这里回答Make parts of textview clickable (not 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;
    

希望这对某人有所帮助。

【讨论】:

以上是关于Android:从可点击文本启动活动的主要内容,如果未能解决你的问题,请参考以下文章

Android入门Activity-生命周期与启动模式

当我有意启动它时,为啥android无法识别第二个活动?

在不启动接收活动的情况下将数据传递给活动 (Android)

Android:日常学习笔记——探究活动

如何修复在 Android 中崩溃的活动的重新启动?

如何通过 Web 应用程序启动 android 活动