0
public class MyEditText extends EditText {

public MyEditText(Context context) {
    super(context);
    init();
}

public MyEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

void init() {

    this.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            return false;
        }
    });


    this.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {

        }

        @Override
        public void afterTextChanged(Editable arg0) {
        }

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

            Log.e("afterTextChanged", "" + s);
            if (s.toString().length() > 0 && s.toString().charAt(0) != '$') {
                StringBuilder b = new StringBuilder(s.toString());
                b = b.reverse();
                b.append('$');
                b = b.reverse();
                MyEditText.this.setText(b);
                MyEditText.this.setSelection(MyEditText.this.getText()
                        .length());
            } else {

                int counter = 0;
                for (int i = 0; i < s.toString().length(); i++) {
                    if (s.toString().charAt(i) == '$') {
                        counter++;
                    }
                }
                if (counter > 1) {
                    String str = s.toString().replace("$", "").trim();
                    str = str.replaceAll("\\s+", "");
                    StringBuilder b = new StringBuilder(str);
                    b = b.reverse();
                    b.append('$');
                    b = b.reverse();
                    MyEditText.this.setText(b);
                    MyEditText.this.setSelection(MyEditText.this.getText()
                            .length());
                } else {

                    int spaceCount = 0;

                    for (int i = 0; i < s.toString().length(); i++) {
                        if (s.toString().charAt(i) == ' ') {
                            spaceCount++;
                        }
                    }
                    if (spaceCount > 0) {
                        String str = s.toString().replace("$", "").trim();
                        str = str.replaceAll("\\s+", "");
                        StringBuilder b = new StringBuilder(str);
                        MyEditText.this.setText(b);
                        MyEditText.this.setSelection(MyEditText.this
                                .getText().length());
                    }
                }

            }
        }
    });
}

}

Main_Activity layout is:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.example.mycustomizeedittextsample.MyEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="numberDecimal" />

</RelativeLayout>        

MainActivity.java class is :

public class MainActivity extends Activity  {

MyEditText myEditText;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);

    myEditText = new MyEditText(this);
    }
}

Something is missing in MainActivitybut I don't know what it is. When I run the app the below crash arises:

java.lang.StackOverflowError
at java.lang.StringBuilder.append(StringBuilder.java:202)   at    com.example.dialogfragmentexample.MyEditText$2.beforeTextChanged(MyEditText.java:55)
Ashigore
  • 4,618
  • 1
  • 19
  • 39

3 Answers3

2

You are calling setText inside of beforeTextChanged. This triggers another call to beforeTextChanged, which triggers another call to setText, ... repeat until you run out of stack frames.

Do not change the contents of the editText until afterTextChanged (or later), and be aware of creating infinite loops like this.

Karakuri
  • 38,365
  • 12
  • 84
  • 104
  • please help me for this ques. http://stackoverflow.com/questions/23950178/how-can-we-override-gettext-method-in-edittext?noredirect=1#comment36894386_23950178 – Neetu Shrivastava May 30 '14 at 09:09
1

put your code in onTextChanged() rather then beforeTextchange() and also can put afterText() change method so it will work i tested it

Lavekush Agrawal
  • 6,040
  • 7
  • 52
  • 85
Pawan asati
  • 292
  • 2
  • 13
0

Problem with init();

Most stack overflow errors are related to a method that indirectly calls itself. This is also the case here.

You can set TextWather outside the MyEditText.

So its might be possible nested calling of function trace your init it create infinite call of function of TextWather callback.

EDITED:

MyEditText.java

public class MyEditText extends EditText {

public MyEditText(Context context) {
    super(context);
   // init(); 
} 

public MyEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
   // init(); 
} 

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
   // init(); 
} 
} 

MainActivity.java

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyEditText myEditText = new MyEditText(this);
        myEditText.addTextChangedListener(new CustomTextWatcher(myEditText)); 
    }


    //TextWathcer 

    private class CustomTextWatcher implements TextWatcher {

        private MyEditText mEditText;

        public CustomTextWatcher(MyEditText myEditText) { 
            mEditText = myEditText;
        } 


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

        } 

        @Override 
        public void afterTextChanged(Editable arg0) {
        } 

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

            Log.e("afterTextChanged", "" + s);
            if (s.toString().length() > 0 && s.toString().charAt(0) != '$') {
                StringBuilder b = new StringBuilder(s.toString());
                b = b.reverse();
                b.append('$');
                b = b.reverse();
                mEditText.setText(b);
                mEditText.setSelection(mEditText.getText()
                        .length());
            } else { 

                int counter = 0;
                for (int i = 0; i < s.toString().length(); i++) {
                    if (s.toString().charAt(i) == '$') {
                        counter++;
                    } 
                } 
                if (counter > 1) {
                    String str = s.toString().replace("$", "").trim();
                    str = str.replaceAll("\\s+", "");
                    StringBuilder b = new StringBuilder(str);
                    b = b.reverse();
                    b.append('$');
                    b = b.reverse();
                    mEditText.setText(b);
                    mEditText.setSelection(mEditText.getText()
                            .length());
                } else { 

                    int spaceCount = 0;

                    for (int i = 0; i < s.toString().length(); i++) {
                        if (s.toString().charAt(i) == ' ') {
                            spaceCount++;
                        } 
                    } 
                    if (spaceCount > 0) {
                        String str = s.toString().replace("$", "").trim();
                        str = str.replaceAll("\\s+", "");
                        StringBuilder b = new StringBuilder(str);
                        mEditText.setText(b);
                        mEditText.setSelection(mEditText
                                .getText().length());
                    } 
                } 

            } 
        } 
    } 
}

Layout file are same as previous .

Lavekush Agrawal
  • 6,040
  • 7
  • 52
  • 85