3

If user types a String and it contains @ I want to change the color of the text to red. I have tried with textwatcher but got stack overflow error. I want to change the color only if the @ is at the beginning. The code is given below

topic.addTextChangedListener(new TextWatcher() {

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

        }

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

        }

        public void afterTextChanged(Editable s) {
            
            if (s.toString().matches("(@\\w+)")) {
                topic.setText(Html.fromHtml(s.toString().replaceAll(
                        "(@\\w+)", "<font color='#ffff0000'>$1</font>")));
            }

            
        }
    });
mehdi
  • 340
  • 4
  • 17
user1767260
  • 1,543
  • 8
  • 26
  • 51

6 Answers6

2

You have to remove the textwatcher before you set the new text to edit text. Try this code

           private TextWatcher textWatcher = new TextWatcher() {

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

    }

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

    }

    @Override
    public void afterTextChanged(Editable s) {
        editText.removeTextChangedListener(this);
        String text = editText.getText().toString();

         if (text .matches("(@\\w+)")) {
            editText.setText(Html.fromHtml(text .replaceAll(
                    "(@\\w+)", "<font color='#ffff0000'>$1</font>")));
        }

        editText.addTextChangedListener(this);

    }
};
subair_a
  • 1,028
  • 2
  • 14
  • 19
1
if (s.toString().matches("(@\\w+)")) 
{
      topic.setTextColor(Color.parseColor("#ffff0000"));
}
Goran Horia Mihail
  • 3,536
  • 2
  • 29
  • 40
0

Try this:

topic.addTextChangedListener(new TextWatcher() {

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

    }

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

    }

    public void afterTextChanged(Editable s) {

        if (s.toString().startsWith("@")) {
            topic.setText(
                Html.fromHtml("<font color='#ffff0000'>"+
                s.toString().substring(1)
                +"</font>"));
        }


    }
});
pshegger
  • 2,526
  • 24
  • 29
0
if(s.toString().startsWith("@"))
{
   topic.setTextColor(Color.RED);
}
Onur A.
  • 3,007
  • 3
  • 22
  • 37
0

append to bring curser at end of line and set text null before appending

edt_customer_cc.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

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


        }

        @Override
        public void afterTextChanged(Editable s) {

            edt_customer_cc.removeTextChangedListener(this);

            String text = edt_customer_cc.getText().toString();

            if (text .contains(";")) {

                edt_customer_cc.setText("");

                // append to bring curser at end of line
                edt_customer_cc.append(Html.fromHtml(text.replaceAll(
                        "(\\;)", "<font color='#ff0000'>;</font>")));


            }
            //editText.setText(text);
            //editText.setSelection(text.length());
            edt_customer_cc.addTextChangedListener(this);

        }
    });
0

This is a textWatcher Method

public TextWatcher textWatcher(final EditText editText) {
    return new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {

        }

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

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
         if ("@".equals(s.substring(0, 1))) {
               editText.setTextColor(Color.RED);
            }    
        }
    };
}
mehdi
  • 340
  • 4
  • 17