2016-02-08 16 views
5

Tôi đang làm việc trên một ứng dụng mà người dùng có thể đăng nội dung lên nguồn cấp dữ liệu. Trong văn bản chỉnh sửa của tôi (được sử dụng để soạn thảo), màu văn bản có màu xám. Tuy nhiên, khi người dùng nhập thẻ băm, ví dụ: #help Tôi cần tô màu văn bản màu đen khi họ nhập, vì vậy khi người dùng nhập '#' văn ​​bản phải có màu đen cho đến khi họ bắt đầu một từ mới, sau đó màu văn bản cần hoàn nguyên về màu xám.Thay đổi màu của văn bản khi người dùng nhập thẻ băm

Tôi đã thử sử dụng trình theo dõi văn bản và chuỗi có thể chỉnh màu thành màu.

Dưới đây là những gì tôi đã làm với textwatcher onTextChanged

 @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 


      //Remove Text watcher to prevent infinite look 
      mTextField.removeTextChangedListener(contentFieldWatcher); 
      String startChar = null; 
       startChar = Character.toString(s.charAt(start)); 
       L.i(getClass().getSimpleName(), "CHARACTER OF NEW WORD: " + startChar); 


    if (startChar.equals("#")) { 
        tagCheck(s.toString().substring(start), start, start + count); 
       } 
      } 

phương pháp tagCheck

private void tagCheck(String s, int start, int end) { 
     mSpannable.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.black_colour)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 

mSpannable là một Spannable.

Vấn đề với phương pháp này là '#' hiển thị dưới dạng startChar, tuy nhiên khi người dùng nhập ký tự tiếp theo, ký hiệu hoặc chữ cái, thì nó sẽ hiển thị dưới dạng startChar. Nếu như người dùng gõ santa - 's' vẫn là startChar. Vì vậy, vấn đề tôi đang phải đối mặt với cách tự động tô màu văn bản khi người dùng nhập thẻ bắt đầu bằng #.

Vì vậy, các chữ cái đơn giản hoạt động chính xác, tuy nhiên khi bạn sử dụng ký hiệu thì không. Tôi hy vọng câu hỏi này đã rõ ràng ... Tôi đã xem xét điều này trong một vài ngày và tất cả đều trở nên mơ hồ :)

Trả lời

3

tôi đã cố gắng và tìm thấy soloution

Bạn có thể sử dụng đoạn mã sau

Spannable mspanable; 
int hashTagIsComing = 0; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 



    final EditText edt = (EditText) findViewById(R.id.editText1); 

    mspanable = edt.getText(); 

    edt.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

      String startChar = null; 

      try{ 
       startChar = Character.toString(s.charAt(start)); 
       Log.i(getClass().getSimpleName(), "CHARACTER OF NEW WORD: " + startChar); 
      } 
      catch(Exception ex){ 
       startChar = " "; 
      } 

       if (startChar.equals("#")) { 
        tagCheck(s.toString().substring(start), start, start + count); 
        hashTagIsComing++; 
       } 

       if(startChar.equals(" ")){ 
        hashTagIsComing = 0; 
       } 

       if(hashTagIsComing != 0) { 
        tagCheck(s.toString().substring(start), start, start + count); 
        hashTagIsComing++; 
       } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 



} 


private void tagCheck(String s, int start, int end) { 
    mspanable.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 
+0

Chú ý rằng bạn nhất làm hashtag rõ ràng từ các nhân vật không phù –

+0

có một vấn đề với khả năng tự đề nghị, nếu người dùng nhấp vào đề xuất tự động, chúng tôi sẽ mất màu –

1

Tôi đã đạt được hành vi mà bạn mô tả, chỉ là tôi đang thiết lập văn bản màu trên một TextView riêng biệt. Xem ảnh chụp màn hình và mã bên dưới. Tôi hy vọng điều này sẽ giúp

Trong afterTextChanged của người nghe:

@Override 
public void afterTextChanged(Editable s) { 
    editText.removeTextChangedListener(textWatcher); 
    colorText(s.toString()); 
} 

Phương pháp để tìm "#" ký tự và văn bản màu cho đến khi vũ trụ đầu tiên:

private void colorText(String s) { 
    if (!TextUtils.isEmpty(s)) { 
     Spannable spannable = new SpannableString(s); 
     int position = 0; 
     position = s.indexOf("#", position); 
     while (position != -1) { 
      colorSpannable(spannable, position, s.indexOf(" ", position + 1) != -1 ? s.indexOf(" ", position + 1) : s.length()); 
      position = s.indexOf("#", position + 1); 
     } 
     textView.setText(spannable); 
    } 
    editText.addTextChangedListener(textWatcher); 
} 

colorSpannable chỉ đơn giản là bổ sung thêm màu sắc từ chỉ số bắt đầu để lập chỉ mục kết thúc

private void colorSpannable(Spannable s, int start, int end){ 
    s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 

enter image description here

Các vấn đề liên quan