Android EditText: how to apply Foreground color range on input?

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()); } 
+6
source share
3 answers

You can use the template to search for words, and then apply any range to the words.

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

What is it. it will highlight all the relevant words that you enter. Hope this helps.

+5
source

I changed the start of Spannable from position to 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); 
+1
source

like this....

 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; } 
+1
source

Source: https://habr.com/ru/post/952078/


All Articles