16

I have two text fields and a Button. I want to disable the Button unless both EditText-Fields are not empty. I tried many solutions here at stackoverflow, but they don't work. Here is my code:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


public class RegisterActivity extends Activity {

    private EditText editText1;
    private EditText editText2;

    //TextWatcher
    private TextWatcher textWatcher = 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) {
            checkFieldsForEmptyValues();
        }

        @Override
        public void afterTextChanged(Editable editable) {
        }
    };


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


        editText1 = (EditText) findViewById(R.id.reg_password);
        editText2 = (EditText) findViewById(R.id.reg_password2);

        //set listeners
        editText1.addTextChangedListener(textWatcher);
        editText1.addTextChangedListener(textWatcher);

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


        TextView loginScreen = (TextView) findViewById(R.id.link_to_login);
        loginScreen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity (new Intent(getApplicationContext(), DialogActivity.class));
                finish();
            }
        });

    }

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

        String s1 = editText1.getText().toString();
        String s2 = editText2.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);
        }
    }
}

If I start the activity, it is disabled. But If I type something, it sometimes enables and sometimes doesn't.. I just want to enable the button if both Edit-Text Fields are not empty.

mmBs
  • 8,421
  • 6
  • 38
  • 46
androidBeginner
  • 197
  • 1
  • 2
  • 10
  • 1
    Use b.setEnabled(!s1.isEmpty() && !s2.isEmpty()); Also, AfterTextChanged may work better for you – Kuffs Dec 19 '13 at 13:26

7 Answers7

13

Your problem is here:

//set listeners
        editText1.addTextChangedListener(textWatcher);
        editText1.addTextChangedListener(textWatcher);

You are not setting the textWatcher to editText2, so you are always checking the condition if you write inside editText1

noni
  • 2,927
  • 19
  • 18
  • I read the code many times, the empty condition is not the best but it was OK, so the problem was in other place :) – noni Dec 19 '13 at 13:28
6

I know this is old, but keep in mind that by simply using .isEmpty() will allow you to only add a space and the button will enable itself.

Use s1.trim().isEmpty || s2.trim().isEmpty() instead.

Or, you can do:

String s1 = editText1.getText().toString().trim() String s2 = editText2.getText().toString().trim()

then just check for .isEmpty().

I don't know, it's however you'd want to do it, and this answer is most likely irrelevant anyway but I'd thought I'd just point that out.

BrandonBrown
  • 61
  • 1
  • 1
3

You method checkFieldsForEmptyValues is too complicated for what your doing, try just by doing :

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

        String s1 = editText1.getText().toString();
        String s2 = editText2.getText().toString();

        if (s1.length() > 0 && s2.length() > 0) {
            b.setEnabled(true);
        } else {
            b.setEnabled(false);
        }

}
Andros
  • 4,069
  • 1
  • 22
  • 30
  • it doesn't work at the beginning, I I type at both fields it stays disabled, then I have to type sth. at field1 again then it enables – androidBeginner Dec 19 '13 at 13:31
3

A different way to do this would be

b.setEnabled(!s1.trim().isEmpty() && !s2.trim().isEmpty());
codeMagic
  • 44,549
  • 13
  • 77
  • 93
3

You may resolve this problem a much shorter:

@Override
protected void onResume() {
    super.onResume();
    TextWatcher tw = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

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

        @Override
        public void afterTextChanged(Editable editable) {
           updateSignInButtonState();
        }
    };

    editLogin.addTextChangedListener(tw);
    editPassword.addTextChangedListener(tw);

}

private void updateSignInButtonState() {
    buttonSignIn.setEnabled(editLogin.getText().length() > 0 &&
                            editPassword.getText().length() > 0);
}
lovesuper
  • 323
  • 3
  • 12
0

Instead of this

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

try this

 if(s1.isEmpty() || s2.isEmpty())
    {
        b.setEnabled(false);
    }

change all the validating condition from && this to ||

Kirk
  • 4,957
  • 2
  • 32
  • 59
0

My way was:

  1. button setEnabled(false)

  2. I used TextWatcher to listen for text change and update status of button in afterTextChanged function

Here is my code:

TextWatcher tw = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    }

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

    @Override
    public void afterTextChanged(Editable editable) {
        updateSignInButtonState();
    }
};

public void updateSignInButtonState() {
    btnSubmit.setEnabled(edUsername.getText().length() > 0 &&
            edPassword.getText().length() > 0);
}
gkubed
  • 1,849
  • 3
  • 32
  • 45