2012-03-06 66 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的自動鏈接功能上可以鏈接任何東西,而不僅僅是網址,電子郵件和電話號碼。它還提供了顏色定製和觸摸反饋。