In Android, how to make Login button disable with respect to EditText?

22,167

Solution 1

heres what you are looking for :

private EditText et1,et2;
//  create a textWatcher member
private TextWatcher mTextWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
    }

    @Override
    public void afterTextChanged(Editable editable) {
        // check Fields For Empty Values
        checkFieldsForEmptyValues();
    }
};

void checkFieldsForEmptyValues(){
    Button b = (Button) findViewById(R.id.button1);

    String s1 = et1.getText().toString();
    String s2 = et2.getText().toString();

    if(s1.equals("")|| s2.equals("")){
        b.setEnabled(false);
    } else {
        b.setEnabled(true);
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login_check);
    et1 = (EditText) findViewById(R.id.editText1);
    et2 = (EditText) findViewById(R.id.editText2);


    // set listeners
    et1.addTextChangedListener(mTextWatcher);
    et2.addTextChangedListener(mTextWatcher);

    // run once to disable if empty
    checkFieldsForEmptyValues(); 
}

Solution 2

You need to implement TextWatcher on EditText to achieve the result.

EditText et1, et2;
Button b;

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

    et1 = (EditText) findViewById(R.id.editText1);
    et2 = (EditText) findViewById(R.id.editText2);
    b = (Button) findViewById(R.id.button1);

    checkValidation();

    et1.addTextChangedListener(mWatcher);
    et2.addTextChangedListener(mWatcher);
}

private void checkValidation() {
    // TODO Auto-generated method stub

    if ((TextUtils.isEmpty(et1.getText()))
            || (TextUtils.isEmpty(et2.getText())))
        b.setEnabled(false);
    else
        b.setEnabled(true);

}

TextWatcher mWatcher = new TextWatcher() {

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

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

    }

    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub

    }
};

Solution 3

You need to track user's action inside EditText using TextWatcher object:

myEditText.addTextChangedListener(new TextWatcher()
        {

            @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)
            {
                if (s.length() > 1)
                {
                    //enable button
                } else
                    //disable
            }
        });

Solution 4

You need to attach a TextWatcher that is called whenever the text in one of the EditText fields is changed.

private EditText mName;
private EditText mPassword;
private Button mButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_login_check);
    mName = (EditText) findViewById(R.id.editText1);
    mPassword = (EditText) findViewById(R.id.editText2);
    mButton = (Button) findViewById(R.id.button1);

    mName.addTextChangedListener(mWatcher);
    mPassword.addTextChangedListener(mWatcher);
}

private TextWatcher mWatcher = new TextWatcher() {
    @Override
    public void afterTextChanged(Editable s) {
        boolean nameNotEmpty = mName.getText().length()>0;
        boolean pwNotEmpty = mPassword.getText().length()>0;
        mButton.setEnabled(nameNotEmpty && pwNotEmpty);
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}
};

Solution 5

try this:

EditText et1,et2;
Button b;

@Override
protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_login_check);
  et1 = (EditText) findViewById(R.id.editText1);
  et2 = (EditText) findViewById(R.id.editText2);
  b = (Button) findViewById(R.id.button1);


  et1.addTextChangedListener(new TextWatcher() {

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

                            String s1 = et1.getText().toString();
                            String s2 = et2.getText().toString();

                             if(s1.equals("") && s2.equals("")){
                                   b.setEnabled(false);
                            } 
                            else if(!s1.equals("")&&s2.equals("")){
                                   b.setEnabled(false);
                            }
                            else if(!s2.equals("")&&s1.equals(""){
                                   b.setEnabled(false);
                            }
                            else {
                            b.setEnabled(true);
                          }

        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    });
  et2.addTextChangedListener(new TextWatcher() {

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

                            String s1 = et1.getText().toString();
                            String s2 = et2.getText().toString();

                            if(s1.equals("") && s2.equals("")){
                                   b.setEnabled(false);
                            } 
                            else if(!s1.equals("")&&s2.equals("")){
                                   b.setEnabled(false);
                            }
                            else if(!s2.equals("")&&s1.equals(""){
                                   b.setEnabled(false);
                            }
                            else {
                            b.setEnabled(true);
                          }

        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    });

}
Share:
22,167
DroidLearner
Author by

DroidLearner

Updated on February 05, 2020

Comments

  • DroidLearner
    DroidLearner about 4 years

    If EditText is empty then Login Button has to be disabled. And if EditText has some texts then Login Button has to be enabled. Well you can see this method on Instagram Login.

    Both fields are empty, Sign in Button is DISABLED.

    enter image description here

    Here Password field is empty, so still Sign inButton is DISABLED.

    enter image description here

    Here both Username and Password field is not empty, So Sign inButton is ENABLED.

    enter image description here

    how to achieve these steps?? here is my code and it doesn't work..

    EditText et1,et2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_check);
        et1 = (EditText) findViewById(R.id.editText1);
        et2 = (EditText) findViewById(R.id.editText2);
        Button b = (Button) findViewById(R.id.button1);
    
        String s1 = et1.getText().toString();
        String s2 = et2.getText().toString();
    
        if(s1.equals("")|| s2.equals("")){
            b.setEnabled(false);
        } else {
            b.setEnabled(true);
        }
    }
    
  • VikramV
    VikramV over 10 years
    +1 for you petey!! It worked for me as well. Thanks.
  • petey
    petey over 6 years
    @SalutAmigo . perhaps you have a different issue. Thanks for the unexplained down vote.