I have two entry boxes(Edit Text Box) In android layout, I am trying to set one edit text box's text to another Edit text box's text by calculating some value and Vice versa(getting text from second text box then calculate and add it to first text box) in real time(on current time of typing in edit box), I have seen some of the answers on 'On Text Change Listeners' and tried but might be due to focusing issue of edit boxes it is crashing.
Adding text watcher at the same time may cause a problem (Recurring effect). But you can achieve your requirement by activating text watcher one at a time. While edittext1 text changes we will remove text watcher for edittext2 and we will set edittext2 in onTextChanged
of text watcher of edittext1. then we will reactivate text watcher of edittext2 in afterTextChanged
text watcher of edittext1. the same logic applies to edittext1.
public class MainActivity extends AppCompatActivity {
EditText editText1,editText2,editText3,editText4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText1=findViewById(R.id.editText1);
editText2=findViewById(R.id.editText2);
editText3=findViewById(R.id.editText3);
editText4=findViewById(R.id.editText4);
editText1.addTextChangedListener(textWatcher1);
editText2.addTextChangedListener(textWatcher2);
editText3.addTextChangedListener(textWatcher3);
editText4.addTextChangedListener(textWatcher4);
}
TextWatcher textWatcher1=new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
editText2.removeTextChangedListener(textWatcher2);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
editText2.setText(editText1.getText());
}
@Override
public void afterTextChanged(Editable s) {
editText2.addTextChangedListener(textWatcher2);
}
};
TextWatcher textWatcher2=new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
editText1.removeTextChangedListener(textWatcher1);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
editText1.setText(editText2.getText());
}
@Override
public void afterTextChanged(Editable s) {
editText1.addTextChangedListener(textWatcher1);
}
};
}
TextWatcher textWatcher3=new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
editText4.removeTextChangedListener(textWatcher4);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
editText4.setText(editText3.getText());
}
@Override
public void afterTextChanged(Editable s) {
editText4.addTextChangedListener(textWatcher4);
}
};
TextWatcher textWatcher4=new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
editText3.removeTextChangedListener(textWatcher3);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
editText3.setText(editText4.getText());
}
@Override
public void afterTextChanged(Editable s) {
editText3.addTextChangedListener(textWatcher3);
}
};
}