Отключить кнопку при изменении текстовых полей
У меня есть два текстовых поля и кнопка. Я хочу отключить Button, если оба EditText-поля не пусты. Я попробовал много решений здесь, в stackoverflow, но они не работают. Вот мой код:
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);
}
}
}
Если я начну свою деятельность, она будет отключена. Но если я что-то печатаю, он иногда включает, а иногда и нет. Я просто хочу включить кнопку, если оба поля Edit-Text не пусты.
Ответы
Ответ 1
Ваша проблема здесь:
//set listeners
editText1.addTextChangedListener(textWatcher);
editText1.addTextChangedListener(textWatcher);
Вы не устанавливаете textWatcher в editText2, поэтому вы всегда проверяете условие, если вы пишете внутри editText1
Ответ 2
Я знаю, что это старый, но имейте в виду, что просто используя .isEmpty()
позволит вам только добавить пробел, и кнопка сама включится.
Используйте s1.trim().isEmpty || s2.trim().isEmpty()
вместо этого.
Или вы можете сделать:
String s1 = editText1.getText().toString().trim()
String s2 = editText2.getText().toString().trim()
то просто проверьте .isEmpty()
.
Я не знаю, но вы бы это сделали, и этот ответ, скорее всего, не имеет отношения к делу, но я подумал, что просто хочу сказать это.
Ответ 3
Метод checkFieldsForEmptyValues
слишком сложный для того, что вы делаете, попробуйте сделать это:
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);
}
}
Ответ 4
Другой способ сделать это:
b.setEnabled(!s1.trim().isEmpty() && !s2.trim().isEmpty());
Ответ 5
Вы можете решить эту проблему намного короче:
@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);
}
Ответ 6
Вместо этого
if(s1.equals("") && s2.equals(""))
{
b.setEnabled(false);
}
попробуйте это
if(s1.isEmpty() || s2.isEmpty())
{
b.setEnabled(false);
}
изменить все условия проверки из && это к ||
Ответ 7
Мой путь:
Вот мой код:
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);
}