2016-08-16 64 views
1

我想改變一個詞的顏色,當我觸摸它。安卓更改一個詞的顏色觸摸

例如:你好,我的名字是羅伯特。

(默認情況下,所有黑色)

現在,如果用戶觸摸單詞「羅伯特」,我想「羅伯特」的顏色變爲紅色。

我該怎麼做? (我是Android新手)

textview.setTextColor()改變了整個事情,我只想要一個詞。

+2

使用'SpannableString':http://www.chrisumbel.com/article/android_textview_rich_text_spannablestring – pnavk

回答

0

L. Swifter是在正確的軌道上。

這是一個非常簡單的版本,你可以建立。

SpannableString spannableString = new SpannableString(yourstring); 

ClickableSpan clickableSpan = new ClickableSpan() { 
     boolean clicked = false; 

     @Override 
     public void onClick(View view) { 
      clicked = true; 
      view.invalidate(); 
     } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      if (this.clicked) ds.setColor(Color.RED); 
     } 
    }; 

spannableString.setSpan(clickableSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

textview.setText(spannableString); 
textview.setMovementMethod(LinkMovementMethod.getInstance()); 

開始和結束都是「羅伯特」的索引位置

確保您的setText使用spannableString,而不是原始字符串。

玩得開心!

0

您可以將一個HTML <font>標記添加到TextView的文本。

2

我相信SpannableStringClickableSpan是你正在尋找的東西。

欲瞭解更多信息,請檢查this

Html.fromHtml也適用於此。

0
  1. 使用onTouch來計算你剛剛接觸它的話,look at this.
  2. 和:

    TextView.setText(Html.fromHtml( 「assumble你的HTML風格的字符串來改變指定的字顏色」));

0

總結L.更快和TML的答案,還使用了答案從 select a word on a tap in TextView/EditText

下面的代碼應該是工作,如果你單擊TextView的任何單詞。 如果點擊它,顏色將變爲紅色。其他詞語顏色將重置爲黑色。

public class MainActivity extends AppCompatActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final TextView lTextView = (TextView) findViewById(R.id.textView); 
    breakEveryWord("Clickable words in text view ", lTextView); 
} 
... 

private void breakEveryWord(String passage, final TextView pTextView) { 
    String definition = passage.trim(); 
    pTextView.setMovementMethod(LinkMovementMethod.getInstance()); 
    pTextView.setText(definition, TextView.BufferType.SPANNABLE); 
    final Spannable spans = (Spannable) pTextView.getText(); 
    BreakIterator iterator = BreakIterator.getWordInstance(Locale.US); 
    iterator.setText(definition); 
    int start = iterator.first(); 
    for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator 
      .next()) { 
     String possibleWord = definition.substring(start, end); 
     if (Character.isLetterOrDigit(possibleWord.charAt(0))) { 
      ClickableSpan clickSpan = new CustomClickableSpan(possibleWord, new CallBack() { 
       @Override 
       public void clearAll() { 
        CustomClickableSpan[] toRemoveSpans = spans.getSpans(0, pTextView.getText().length(), CustomClickableSpan.class); 
        for (CustomClickableSpan toRemoveSpan : toRemoveSpans) { 
         toRemoveSpan.reset(pTextView); 
        } 
       } 
      }); 
      spans.setSpan(clickSpan, start, end, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 
    } 
} 
public static class CustomClickableSpan extends ClickableSpan { 
    final String mWord; 
    boolean clicked = false; 
    final CallBack mCallBack; 
    public CustomClickableSpan(String pWord, CallBack pCallBack) { 
     mWord = pWord; 
     mCallBack = pCallBack; 
    } 
    public void reset(View widget) { 
     clicked = false; 
     widget.invalidate(); 
    } 
    @Override 
    public void onClick(View widget) { 
     Log.d("tapped on:", mWord); 
     mCallBack.clearAll(); 
     clicked = true; 
     widget.invalidate(); 
    } 
    @Override 
    public void updateDrawState(TextPaint ds) { 
     super.updateDrawState(ds); 
     ds.setUnderlineText(false); 
     ds.setColor(Color.BLACK); 
     if (this.clicked) ds.setColor(Color.RED); 
    } 
} 
public interface CallBack { 
    void clearAll(); 
} 
}