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 MainActivity
but 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)