2014-12-21 2 views
5

Каждый раз, когда Edittext onAfterTextChange метод, я проверяю, если введена какая-то специальная строка (которая поступает из переменной functionlist), а затем измените особый цвет этой строки. Код нижеAndroid Edittext Spannable Issue

for(String s:functionList) 
    { 
     final Pattern p = Pattern.compile(s); 
     final Matcher matcher = p.matcher(inputStr); 

     while(matcher.find()) 
     { 
      //if(matcher.end() - matcher.start()== s.length()) 
      inputStr.setSpan(new ForegroundColorSpan(Color.parseColor(highlightColor)),  
      matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 
    } 

Причина, по которой я не использую метод Html.FromHtml; это заставляет меня использовать метод setText, который меняет положение курсора, и поскольку мой edittext также изменен с кнопок (кнопок call settext) не только на softkeyboard, этот метод settext разрушает позицию курсора, так как кнопка изменяет положение курсора на 0 EVEN, это НЕ! !!! поэтому я не могу добавить что-то посередине с помощью softkeyboard (при попытке добавить, курсорная позиция всегда установлена ​​на 0). Вот почему я должен использовать spannable.

Во всяком случае моя проблема, например, один из моего специального текста «входа» .. когда я входной журнал работает нормально (журнал), когда Append лог с пробелом (журнала журнала) он отлично работает снова , но КОГДА Я УДАЛЯЮ G из второго журнала, первый цвет журнала также ушел !!! (log lo), который не должен происходить. Думайте полужирным журналом, поскольку он окрашен ...

Почему это происходит?

+0

кажется, что ваш диапазон выглядит (в HTML, как синтаксис): журнала журнала pskink

+0

Когда я SetText курсор положение пропадает до тех пор, пока пользовательские входы не будут работать с программной клавиатурой. Они могут вводиться в обоих направлениях. Html = setText –

ответ

0

Если я правильно понимаю, что вы пытаетесь сделать, вы должны попробовать что-то вроде:

edit.addTextChangedListener(new TextWatcher() 
{ 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) 
    { 
     Spannable inputStr = (Spannable)s; 
     for (String function : functionList) 
     { 
      for (ForegroundColorSpan old : inputStr.getSpans(start, inputStr.length(), ForegroundColorSpan.class)) 
       inputStr.removeSpan(old); 

      final Pattern p = Pattern.compile(function); 
      final Matcher matcher = p.matcher(inputStr); 
      while (matcher.find()) 
       inputStr.setSpan(new ForegroundColorSpan(Color.BLUE), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 

    @Override 
    public void afterTextChanged(Editable s) { } 
});