I am trying to apply font color to text in an EditText while typing. However, its just very inconsistent, which means that sometimes, if you enter a space, the text preceding this space will revert to black by default. Or, if I put the cursor in the middle of the word and start typing the whole word, it changes color, not just the text that I print. Bold, italics, and underlining seem to work well. How can I guarantee that only the text that I type will be affected in terms of font color?
See the comment "SIZE AND COLOR" below ...
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()); }
source share