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.
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
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.
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);
}
}
A different way to do this would be
b.setEnabled(!s1.trim().isEmpty() && !s2.trim().isEmpty());
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);
}
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 ||
My way was:
button setEnabled(false)I used
TextWatcherto listen for text change and update status of button inafterTextChangedfunction
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);
}
来源:https://stackoverflow.com/questions/20682865/disable-button-when-edit-text-fields-empty