如何使用 Textwatcher 禁用具有多个编辑文本的按钮?
How to disable button with multiple edit text using Textwatcher?
如果我的输入编辑文本为空,我将尝试禁用我的按钮。我正在为此使用文本观察器。为了测试它,我只尝试了两个编辑文本来开始。
但是,无论如何,我的按钮都保持启用状态。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_profile);
fnameInput = findViewById(R.id.et_firstname);
lnameInput = findViewById(R.id.et_lastname);
numberInput = findViewById(R.id.et_phone);
emailInput = findViewById(R.id.et_email);
nextBtn = findViewById(R.id.btn_next);
fnameInput.addTextChangedListener(loginTextWatcher);
lnameInput.addTextChangedListener(loginTextWatcher);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchNextActivity();
}
});
}
文本观察器方法
private TextWatcher loginTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String firstNameInput =firstNameInput.getText().toString().trim();
String lastNameInput = lastNameInput.getText().toString().trim();
// tried doing it this way
nextBtn.setEnabled(!firstNameInput.isEmpty() && !lastNameInput.isEmpty());
//What i've also tried
if(firstNameInput.length()> 0 &&
lastNameInput.length()>0){
nextBtn.setEnabled(true);
} else{
nextBtn.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
我希望按钮在一个或所有输入为空时被禁用,而在所有输入字段都已填写时被启用。
创建一个检查所有条件的方法,例如
private void checkTheConditions(){
if(condition1 && condition2)
nextBtn.setEnabled(true)
else
nextBtn.setEnabled(false)
}
从 afterTextChanged(Editable s)
方法中调用此方法
哦!你犯了一个小错误。使用 OR
条件而不是 AND
。所以你的代码应该是
nextBtn.setEnabled(!firstNameInput.isEmpty() || !lastNameInput.isEmpty());
并且 TextWatcher 只会在您手动更改 EditText
的输入时发出通知。所以 TextWatcher 不会在启动时发出警告。所以首先在 onCreate
方法中你应该手动检查那些 EditText
字段。
编辑:
Android 新的 DataBinding 库最适合这个目的。
让我们暂时只考虑 2 个 EditText 的这种情况。
如下定义 2 个全局 CharSequence
CharSequence fName="";
CharSequence lName="";
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_profile);
fnameInput = findViewById(R.id.et_firstname);
lnameInput = findViewById(R.id.et_lastname);
numberInput = findViewById(R.id.et_phone);
emailInput = findViewById(R.id.et_email);
nextBtn = findViewById(R.id.btn_next);
fnameInput.addTextChangedListener(textWatcher);
lnameInput.addTextChangedListener(textWatcher2);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchNextActivity();
}
});
}
然后你必须为你的每个 Edittext 定义不同的 textwatcher
然后在每个 textWatcher 中为上面定义的 CharSequence 赋值
private TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
fName=s;
validate(); //method to enable or disable button (find method below)
}
@Override
public void afterTextChanged(Editable s) {
}
};
现在是 textWatcher2
private TextWatcher textWatcher2 = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
lName=s;
validate(); //method to enable or disable button (find method below)
}
@Override
public void afterTextChanged(Editable s) {
}
};
现在编写验证方法
void validate(){
if (fName.length()>0 && lName.length()>0){
nextBtn.setEnabled(true);
}else {
nextBtn.setEnabled(false);
}
}
如果我的输入编辑文本为空,我将尝试禁用我的按钮。我正在为此使用文本观察器。为了测试它,我只尝试了两个编辑文本来开始。 但是,无论如何,我的按钮都保持启用状态。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_profile);
fnameInput = findViewById(R.id.et_firstname);
lnameInput = findViewById(R.id.et_lastname);
numberInput = findViewById(R.id.et_phone);
emailInput = findViewById(R.id.et_email);
nextBtn = findViewById(R.id.btn_next);
fnameInput.addTextChangedListener(loginTextWatcher);
lnameInput.addTextChangedListener(loginTextWatcher);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchNextActivity();
}
});
}
文本观察器方法
private TextWatcher loginTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String firstNameInput =firstNameInput.getText().toString().trim();
String lastNameInput = lastNameInput.getText().toString().trim();
// tried doing it this way
nextBtn.setEnabled(!firstNameInput.isEmpty() && !lastNameInput.isEmpty());
//What i've also tried
if(firstNameInput.length()> 0 &&
lastNameInput.length()>0){
nextBtn.setEnabled(true);
} else{
nextBtn.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
我希望按钮在一个或所有输入为空时被禁用,而在所有输入字段都已填写时被启用。
创建一个检查所有条件的方法,例如
private void checkTheConditions(){
if(condition1 && condition2)
nextBtn.setEnabled(true)
else
nextBtn.setEnabled(false)
}
从 afterTextChanged(Editable s)
方法中调用此方法
哦!你犯了一个小错误。使用 OR
条件而不是 AND
。所以你的代码应该是
nextBtn.setEnabled(!firstNameInput.isEmpty() || !lastNameInput.isEmpty());
并且 TextWatcher 只会在您手动更改 EditText
的输入时发出通知。所以 TextWatcher 不会在启动时发出警告。所以首先在 onCreate
方法中你应该手动检查那些 EditText
字段。
编辑: Android 新的 DataBinding 库最适合这个目的。
让我们暂时只考虑 2 个 EditText 的这种情况。 如下定义 2 个全局 CharSequence
CharSequence fName="";
CharSequence lName="";
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_profile);
fnameInput = findViewById(R.id.et_firstname);
lnameInput = findViewById(R.id.et_lastname);
numberInput = findViewById(R.id.et_phone);
emailInput = findViewById(R.id.et_email);
nextBtn = findViewById(R.id.btn_next);
fnameInput.addTextChangedListener(textWatcher);
lnameInput.addTextChangedListener(textWatcher2);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchNextActivity();
}
});
}
然后你必须为你的每个 Edittext 定义不同的 textwatcher
然后在每个 textWatcher 中为上面定义的 CharSequence 赋值
private TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
fName=s;
validate(); //method to enable or disable button (find method below)
}
@Override
public void afterTextChanged(Editable s) {
}
};
现在是 textWatcher2
private TextWatcher textWatcher2 = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
lName=s;
validate(); //method to enable or disable button (find method below)
}
@Override
public void afterTextChanged(Editable s) {
}
};
现在编写验证方法
void validate(){
if (fName.length()>0 && lName.length()>0){
nextBtn.setEnabled(true);
}else {
nextBtn.setEnabled(false);
}
}