Reputation: 41
In my project I have 2 EditText fields with Text Change Listener.
final EditText Field1 = (EditText) findViewById(R.id.Field1);
final EditText Field2 = (EditText) findViewById(R.id.Field2);
Field1.addTextChangedListener(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(Field1.getText().toString().equals("")){
}
else{
double number1 = Double.valueOf(Field1.getText().toString());
double number2 = Math.round((number1 * 10) / 25);
Field2.setText(String.valueOf(number2));
}
}
});
Field2.addTextChangedListener(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(Field2.getText().toString().equals("")){
}
else{
}
}
});
When I put a number in Field1 it comes in Field2, that works fine. But when I put this code in Field2:
if(Field2.getText().toString().equals("")){
}
else{
double number2 = Double.valueOf(Field2.getText().toString());
double number1 = Math.round((number2 * 20) / 35);
Field1.setText(String.valueOf(number1));
}
And I put a number in Field2 the app crashes. Stacktrace:
31972-31972/arkstudioapps.textchangelistener E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: arkstudioapps.textchangelistener, PID: 31972
java.lang.StackOverflowError
at android.text.MeasuredText.addStyleRun(MeasuredText.java:164)
at android.text.MeasuredText.addStyleRun(MeasuredText.java:204)
at android.text.StaticLayout.generate(StaticLayout.java:281)
at android.text.DynamicLayout.reflow(DynamicLayout.java:284)
at android.text.DynamicLayout.<init>(DynamicLayout.java:170)
at android.widget.TextView.makeSingleLayout(TextView.java:6134)
at android.widget.TextView.makeNewLayout(TextView.java:6032)
at android.widget.TextView.checkForRelayout(TextView.java:6571)
at android.widget.TextView.setText(TextView.java:3813)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity$2.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity$2.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity$2.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity$2.onTextChanged(MainActivity.java:62)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3646)
at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.setText(TextView.java:3816)
at an
How can I fix this?
Thanks in advance.
Upvotes: 3
Views: 2168
Reputation: 3
final EditText Field1 = (EditText) findViewById(R.id.Field1);
final EditText Field2 = (EditText) findViewById(R.id.Field2);
Field1.addTextChangedListener(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 (getCurrentFocus() == Field1)
{
if(Field1.getText().toString().equals("")){
}
else{
double number1 = Double.valueOf(Field1.getText().toString());
double number2 = Math.round((number1 * 10) / 25);
Field2.setText(String.valueOf(number2));
}
}
}
});
Field2.addTextChangedListener(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 (getCurrentFocus() == Field2)
{
if(Field2.getText().toString().equals("")){
}
else{
double number2 = Double.valueOf(Field2.getText().toString());
double number1 = Math.round((number2 * 20) / 35);
Field1.setText(String.valueOf(number1));
}
}
}
});
Try this it may be helpful to you
Upvotes: 0
Reputation: 7322
1.
As you attempt to use TextWatcher on both EditTexts, it is generally not a good idea to change text in onTextChanged or in other TextWatcher's method. You must avoid getting into an infinite loop because of changing texts in EditTexts.
If you need to perform only one-time calculation and text update of the other field, when you type into one, try this:
In your Activity, define a boolean variable which will control calling setText in TextWather's methods and which will prevent us from getting into infinite loop:
private boolean keepChangingText = true;
Then update your TextWatchers like this:
Field1.addTextChangedListener(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 (Field1.getText().toString().equals("")) {
}
else {
double number1 = Double.valueOf(Field1.getText().toString());
double number2 = Math.round((number1 * 10) / 25);
if (keepChangingText) {
keepChangingText = false;
Field2.setText(String.valueOf(number2));
} else {
keepChangingText = true;
}
}
}
});
Field2.addTextChangedListener(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 (Field2.getText().toString().equals("")) {
}
else {
double number2 = Double.valueOf(Field2.getText().toString());
double number1 = Math.round((number2 * 20) / 35);
if (keepChangingText) {
keepChangingText = false;
Field1.setText(String.valueOf(number1));
} else {
keepChangingText = true;
}
}
}
});
2.
Double.valueOf(Field1.getText().toString());
can fail, if you type some invalid text.
Upvotes: 4
Reputation: 1578
Try with this code this is setontouchListener on EditText simple code to do it
EditText edtName,edtAddress;
TextView tvaData;
editTextName.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
ChangeText();
return false;
}
});
edtAddress.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
ChangeText();
return false;
}
});
private void ChangeText{
tvaData.setText("Abc");
}
Upvotes: 0