2013-08-20 55 views
6

Tôi đang cố gắng áp dụng màu phông chữ cho văn bản trong EditText khi bạn nhập văn bản. Tuy nhiên, nó chỉ rất không nhất quán, có nghĩa là đôi khi nếu bạn gõ một dấu cách, văn bản trước khoảng trắng đó sẽ quay trở lại màu đen mặc định. Hoặc nếu tôi đặt con trỏ ở giữa một từ và bắt đầu nhập toàn bộ từ thay đổi màu và không chỉ là văn bản tôi đang nhập. Chữ đậm, nghiêng và gạch dưới dường như hoạt động tốt. Làm cách nào để đảm bảo rằng chỉ văn bản tôi nhập sẽ bị ảnh hưởng liên quan đến màu phông chữ?Android EditText: Cách áp dụng khoảng màu Foreground khi bạn nhập?

Xem "SIZE VÀ MÀU" bình luận dưới đây ...

 contentEdit.addTextChangedListener(new TextWatcher() { 
      public void afterTextChanged(Editable s) { 

       //add style as the user types if a toggle button is enabled 
       ToggleButton boldButton = (ToggleButton) findViewById(R.id.bold); 
       ToggleButton emButton = (ToggleButton) findViewById(R.id.italic); 
       ToggleButton underlineButton = (ToggleButton) findViewById(R.id.underline); 

       int position = Selection.getSelectionStart(contentEdit.getText()); 

       try{ 
        if (position < 0){ 
         position = 0; 
        } 

        if (position > 0){ 

         if (styleStart > position || position > (cursorLoc + 1)){ 
          //user changed cursor location, reset 
          if (position - cursorLoc > 1){ 
           //user pasted text 
           styleStart = cursorLoc; 
          } 
          else{ 
           styleStart = position - 1; 
          } 
         } 

         if (boldButton.isChecked()){ 
          StyleSpan[] ss = s.getSpans(styleStart, position, StyleSpan.class); 

          for (int i = 0; i < ss.length; i++) { 
           if (ss[i].getStyle() == android.graphics.Typeface.BOLD){ 
            s.removeSpan(ss[i]); 
           } 
          } 
          s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         } 
         if (emButton.isChecked()){ 
          StyleSpan[] ss = s.getSpans(styleStart, position, StyleSpan.class); 

          for (int i = 0; i < ss.length; i++) { 
           if (ss[i].getStyle() == android.graphics.Typeface.ITALIC){ 
            s.removeSpan(ss[i]); 
           } 
          } 
          s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         } 
         if (underlineButton.isChecked()){ 
          UnderlineSpan[] ss = s.getSpans(styleStart, position, UnderlineSpan.class); 

          for (int i = 0; i < ss.length; i++) { 
           s.removeSpan(ss[i]); 
          } 
          s.setSpan(new UnderlineSpan(), styleStart, position, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
         } 

         //SIZE AND COLOR////////////////////////////////////////////////////// 
         s.setSpan(new ForegroundColorSpan(m_color), position, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
         s.setSpan(new AbsoluteSizeSpan(m_curSize, true), position, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
} 
       } 
       catch(Exception e){ 
        //Toast.makeText(m_ctx, m_ctx.gets, Toast.LENGTH_LONG).show(); 
        showMessage(R.string.NOTE_WARNING_STYLE,m_utils.MSGTYPE_WARNING); 
       } 

       cursorLoc = Selection.getSelectionStart(contentEdit.getText()); 
      } 
+1

bất kỳ ai ?? Đây là điều tôi đang tìm kiếm câu trả lời trong một thời gian hiện tại ... – Mike6679

+0

Bạn đang thử nghiệm phiên bản Android nào? Phiên bản tối thiểu và được nhắm mục tiêu? –

+0

2.2 là min và được nhắm mục tiêu – Mike6679

Trả lời

1

tôi đã thay đổi khi bắt đầu Spannable position-position - 1:

//Color 
s.setSpan(new ForegroundColorSpan(m_color), 
      position-1, 
      position, 
      Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
//Size 
s.setSpan(new AbsoluteSizeSpan(m_curSize, true), 
      position-1, 
      position, 
      Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
+0

FYI: thay đổi "bắt đầu của Spannable từ vị trí này sang vị trí - 1" cho phép các văn bản được tô màu như tôi đã gõ nhưng kiểu dáng này khi bạn gõ vẫn còn rất mâu thuẫn và lỗi. Tôi đã kết thúc chỉ áp dụng kiểu cho văn bản được đánh dấu của người dùng hoạt động rất nhất quán. – Mike6679

1

như vậy ....

public static SpannableString parseActiveReply(String name, String body) { 
    SpannableString sp = new SpannableString(name + " " + body); 
    // 设置用户名字体加粗、高亮 
    sp.setSpan(new ForegroundColorSpan(Color.parseColor("#5FADC7")), 0, 
      name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    // sp.setSpan(new ForegroundColorSpan(Color.parseColor("#5FADC7")), 0, 
    // 0, 
    // Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    return sp; 
} 
+0

Các tham số tên và cơ thể đại diện cho những gì? – Mike6679

5

Bạn có thể sử dụng mẫu để tìm từ và sau đó áp dụng bất kỳ khoảng thời gian nào cho từ.

@Override 
public void afterTextChanged(Editable s) { 
    Spannable textSpan = s; 
    final Pattern pattern = Pattern.compile("\\w+"); 
    final Matcher matcher = pattern.matcher(textSpan); 
    while (matcher.find()) { 
     start = matcher.start(); 
     end = matcher.end(); 
     textSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.red)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

    } 

Vậy đó. nó sẽ làm nổi bật tất cả các từ phù hợp bạn nhập. Hy vọng điều đó sẽ hữu ích.

+0

Hoạt động 100% !!! Cảm ơn rất nhiều !!!!!!!!!!! – Guihgo