2012-03-06 97 views
15

如何通过点击文本视图移动到另一个视图与两个不同的词。 这是我正在使用的字符串。如何点击或点击不同单词上的TextView文本?

By clicking Sign Up, you are indicating that you have read and agree to the 
Term of Use and Privacy Policy. 

我想在不同的颜色和点击,使这两个词(使用期限,隐私政策)..

我知道豪使颜色一个特定的词。我想让它可点击。

+0

嗨,如何删除这个“小部件”,并刷新edittext。 ssb.setSpan(新ClickableSpan(){ @覆盖 公共无效的onClick(View部件){// 如何删除这个 “小部件”,并刷新的EditText } },IDX1,IDX2,0); – Sakthi 2015-07-04 07:58:55

回答

50

我终于想通了如何在一个TextView多个可点击的部分。 重要的是它们都有自己的ClickableSpan!这是我第一次测试它时出错的地方。如果它们具有相同的ClickableSpan实例,则只记住最后一个设置范围。

我创建了一个字符串与所需的可点击区域的由“[”和“]”包围。

String sentence = "this is [part 1] and [here another] and [another one]"; 

这里是集TextView的,该setMovementMehthod也是必需的:

textView.setMovementMethod(LinkMovementMethod.getInstance()); 
textView.setText(addClickablePart(sentence), BufferType.SPANNABLE); 

我创造了这个功能,它将处理可点击区域的创建:

private SpannableStringBuilder addClickablePart(String str) { 
    SpannableStringBuilder ssb = new SpannableStringBuilder(str); 

    int idx1 = str.indexOf("["); 
    int idx2 = 0; 
    while (idx1 != -1) { 
     idx2 = str.indexOf("]", idx1) + 1; 

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

      @Override 
      public void onClick(View widget) { 
       Toast.makeText(getView().getContext(), clickString, 
         Toast.LENGTH_SHORT).show(); 
      } 
     }, idx1, idx2, 0); 
     idx1 = str.indexOf("[", idx2); 
    } 

    return ssb; 
} 
+2

这很好,但是显示的'''String'字符串有'['和']',不应该包含在显示的字符串中吗? – 2013-09-10 07:34:45

+0

你可以确定自己,如果你想要的,只是改变源到你的喜好... – Boy 2013-09-24 13:56:21

+1

兄弟这个答案是awesome.You摇滚:-) – 2014-10-01 08:07:18

6

这是更简单的TextView中使用HTML的链接比创建多个TextViews,取约布局护理,听众等

在您的活动或片段:

TextView mText = (TextView) findViewById(R.id.text_linkified); 
    mText.setText(Html.fromHtml("Open <a href='myapp://my-activity'>My Activity</a> or" + 
      " <a href='myapp://other-activity'>Other Activity</a>")); 
    mText.setMovementMethod(LinkMovementMethod.getInstance()); 

在清单

<activity android:name=".MyActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT"/> 
      <data android:scheme="myapp" android:host="my-activity"/> 
     </intent-filter> 
    </activity> 
    <activity android:name=".MyOtherActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT"/> 
      <data android:scheme="myapp" android:host="other-activity" /> 
     </intent-filter> 
    </activity> 
+1

我不在这里使用网址只是文本我想通过点击文本打开新的活动。 – 2012-03-07 04:36:06

+0

如果文本没有改变,例如它在strings.xml中声明了,那么这就是实现它的方法。只需将“可点击”文本声明为带有指向您活动的操作的网址即可。结果你只会得到正在打开新活动的文字,取决于你点击的是哪部分文字。 – pawelzieba 2012-03-07 15:31:35

+0

我编辑答案,因为巨魔投下了票。 – pawelzieba 2013-11-01 15:41:18

11

根据孩子的反应(感谢您的答复这对我帮助很大),这里是另一种方式,我实现它没有这个“[”和“]”用内部类字符来形容clicka BLE的话:

import java.util.List; 

import android.content.Context; 
import android.text.SpannableStringBuilder; 
import android.text.method.LinkMovementMethod; 
import android.text.style.ClickableSpan; 
import android.util.AttributeSet; 
import android.widget.TextView; 

/** 
* Defines a TextView widget where user can click on different words to see different actions 
* 
*/ 
public class ClickableTextView extends TextView { 

    public ClickableTextView(Context context) { 
     super(context); 
    } 

    public ClickableTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ClickableTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void setTextWithClickableWords(String text, List<ClickableWord> clickableWords) { 
     setMovementMethod(LinkMovementMethod.getInstance()); 
     setText(addClickablePart(text, clickableWords), BufferType.SPANNABLE); 
    } 

    private SpannableStringBuilder addClickablePart(String str, List<ClickableWord> clickableWords) { 
     SpannableStringBuilder ssb = new SpannableStringBuilder(str); 

     for (ClickableWord clickableWord : clickableWords) { 
      int idx1 = str.indexOf(clickableWord.getWord()); 
      int idx2 = 0; 
      while (idx1 != -1) { 
       idx2 = idx1 + clickableWord.getWord().length(); 
       ssb.setSpan(clickableWord.getClickableSpan(), idx1, idx2, 0); 
       idx1 = str.indexOf(clickableWord.getWord(), idx2); 
      } 
     } 

     return ssb; 
    } 

    public static class ClickableWord { 
     private String word; 
     private ClickableSpan clickableSpan; 

     public ClickableWord(String word, ClickableSpan clickableSpan) { 
      this.word = word; 
      this.clickableSpan = clickableSpan; 
     } 

     /** 
     * @return the word 
     */ 
     public String getWord() { 
      return word; 
     } 

     /** 
     * @return the clickableSpan 
     */ 
     public ClickableSpan getClickableSpan() { 
      return clickableSpan; 
     } 
    } 
} 

希望这可以帮助别人

编辑:如何更改链接颜色并删除下划线:

创建和使用自己的实现ClickableSpan的是这样的:

//a version of ClickableSpan without the underline 
public static class NoUnderlineClickableSpan extends ClickableSpan { 
    private int color = -1; 

    public void setColor(int color) { 
     this.color = color; 
    } 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     ds.setUnderlineText(false); 
     if (this.color != -1) { 
      ds.setColor(this.color); 
     } 
    } 
} 
+0

不错!很好,我可以帮你解决这个问题......我想我会再次使用你的课程来完成我的项目:) – Boy 2014-03-03 08:04:23

+0

谢谢你和@Boy工作完美。单词看起来有下划线和蓝色。我如何设计它? – 2014-11-02 06:04:16

+0

您必须定义一个自定义的ClickableSpan以在ClickableWord中使用。我将编辑我的回复并添加它 – phyzalis 2014-11-04 01:44:15

0

在ClickableTextView实现中,如果字符串有一个词反复出现什么情况? 假设例如字符串为“我是可以点击的,也这是点击”那么这两个字符串应改为Spannable字符串,但它失败,该方案中,只有一个会改为spannable字符串。

+0

你可以看看我的答案是循环所有单词 – phyzalis 2014-11-04 01:46:36

1

我建议这个库:https://github.com/klinker24/Android-TextView-LinkBuilder

它符合你要求的非常好。

快速概述:

enter image description here

复制格式项目的自述:

  • 指定您的TextView中的特定词的长期和短期的点击动作
  • 通过突出显示提供用户反馈用户触摸它时的文本 匹配单个字符串或使用正则表达式设置可点击的链接以符合任何文本模式
  • 更改链接文本
  • 的颜色修改文本的高亮显示的透明度,当用户触摸它
  • 设置您是否希望在文本强调

主要优势,使用此库在TextView的自动链接功能上可以链接任何东西,而不仅仅是网址,电子邮件和电话号码。它还提供了颜色定制和触摸反馈。