teekib
teekib

Reputation: 2821

Android: Handling multiple EditText, updating them parallely

Hi i have 3 edittexts when some enters the values in the 1st edittext parallel the other two edit texts will be update with converted values. same when i enter the values in other two edittexts remaining edittexts will be updated , but the values are wrongly calculated since it is taking the values into consideration and updating .how to make focus on editext and consider only entered values but not the other calculated values .

edt1.addTextChangedListener(new TextWatcher() {
    boolean editing = false;
    @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) {
        String qtyString = s.toString().trim();
        if(!editing) 
        { 
        editing = true;
        if(qtyString.length() > 0){
           edt2.setText(String.valueOf(hexTodecimal(qtyString)));
           edt3.setText(String.valueOf(hexTobinary(qtyString)));
        }
        else{
            edt2.setText("");
           edt3.setText("");
        }
        editing = false;
        } 

    }
});

my edittext 2

edt2.addTextChangedListener(new TextWatcher() {
    boolean editing = false;
    @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) {
        String qtyString = s.toString().trim();
        if(!editing) 
        { 
        editing = true;
        if(qtyString.length() > 0){
            edt_hex_val.setText(String.valueOf(binarytohex(qtyString)));
           // edt_binary_val.setText(String.valueOf(hexTobinary(qtyString)));
        }
        else{
            edt_hex_val.setText("");
            //edt_binary_val.setText("");
        } 
        editing = false;
        } 

    }
});

my edittext 3

edt3.addTextChangedListener(new TextWatcher() {
    boolean editing = false;
    @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) {
        String qtyString = s.toString().trim();
        if(!editing) 
        { 
        if(qtyString.length() > 0){
           // edt_decimal_val.setText(String.valueOf(hexTodecimal(qtyString)));
            edt_hex_val.setText(String.valueOf(binarytohex(qtyString)));
        }
        else{
            edt_hex_val.setText("");
            //edt_decimal_val.setText("");
        }
        editing = false;
        } 
    }
});
}

Edit: I tried as below but the values are not updating

textWatcher=new TextWatcher() {

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // TODO Auto-generated method stub 

    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        // TODO Auto-generated method stub 

    } 

    @Override 
    public void afterTextChanged(Editable s) {
         qtyString = s.toString().trim();
        // System.out.println("printing sting==============="+qtyString);
          if (s == edt_hex_val.getEditableText()) {
            edt_decimal_val.removeTextChangedListener(textWatcher);
            edt_binary_val.removeTextChangedListener(textWatcher);


              if(qtyString.length() > 0 ){

                    edt_decimal_val.setText(String.valueOf(hexTodecimal(qtyString)));
                    edt_binary_val.setText(String.valueOf(hexTobinary(qtyString)));

                }else{

                     edt_decimal_val.setText("");
                     edt_binary_val.setText("");
                }


            } else if (s == edt_decimal_val.getEditableText()) {
                edt_hex_val.removeTextChangedListener(textWatcher);
                edt_binary_val.removeTextChangedListener(textWatcher);
                 if(qtyString.length() > 0){
                     edt_hex_val.setText(String.valueOf(hexTodecimal(qtyString)));
                     edt_binary_val.setText(String.valueOf(hexTobinary(qtyString)));
                 }else{

                    edt_hex_val.setText("");
                     edt_binary_val.setText("");
                }

            } else if (s == edt_binary_val.getEditableText()) {
                edt_hex_val.removeTextChangedListener(textWatcher);
                edt_decimal_val.removeTextChangedListener(textWatcher);
                 if(qtyString.length() > 0){
                     edt_hex_val.setText(String.valueOf(hexTodecimal(qtyString)));
                     edt_decimal_val.setText(String.valueOf(hexTobinary(qtyString)));
                 }else{

                    edt_hex_val.setText("");
                    edt_decimal_val.setText("");
                }

            } 

    } 
}; 

Upvotes: 1

Views: 347

Answers (1)

k3b
k3b

Reputation: 14755

boolean editing should prevent recursive triggering of TextWatcher-events while setting the other EditText-s. However since every TextWatcher has its own instance of editing this protection does not work. making editing more global should solve the issue.

private EditText edt1;
private EditText edt2;
boolean editing = false; // all EditText-s use the same editing flag

edt1.addTextChangedListener(new TextWatcher() {
    // boolean editing = false; // make this global
    ....
});

edt2.addTextChangedListener(new TextWatcher() {
    // boolean editing = false; // make this global
    ....
});

Upvotes: 1

Related Questions