2014-12-21 18 views
5

Everytime Edittext onAfterTextChange-Methode, ich überprüfe, ob eine spezielle Zeichenfolge (die von der Variablen der Funktionsliste stammt) eingegeben wird, ändern Sie dann die spezielle Farbe der Zeichenfolge. Code ist unterAndroid Edittext Spannable Problem

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); 
     } 
    } 

Der Grund, warum ich nicht Html.FromHtml Methode verwende, ist; es zwingt mich, setText Methode zu verwenden, die Cursorposition ändert und da mein edittext auch von den Knöpfen geändert wird (Tastenaufruf settext) nicht nur softkeyboard, diese settext Methode ruiniert Cursorposition, weil Knopf die Cursorposition zu 0 setzt, SELBST ES IST NICHT! !!! also kann ich nicht etwas in der mitte mit softkeyboard hinzufügen (wenn ich versuche hinzuzufügen, cursorposition ist immer auf 0 gesetzt). Deshalb muss ich spannbar machen.

Wie dem auch sei, mein Problem ist, zum Beispiel einer meiner Spezialtext "log" .. wenn i Eingang log es funktioniert gut (log), wenn append Protokoll mit Leerzeichen (log log) es funktioniert gut wieder , aber wenn ich g aus dem zweiten Protokoll entferne, ist die erste Log-Farbe auch weg !!! (log lo), was nicht passieren darf. Denken Sie dicke Protokolle, wie es gefärbt ist ...

Warum passiert es?

+0

scheint, dass Ihre Spannweite wie (in HTML-ähnliche Syntax) aussieht: log log pskink

+0

Wenn i setText Cursor Position ist weg die Null bis Benutzereingaben mit Softwaretastatur. Sie können auf beide Arten eingeben. Html = setText –

Antwort

0

Wenn ich das richtig verstanden, was Sie zu tun versuchen, sollten Sie so etwas wie versuchen:

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) { } 
});