我有几个EditText
字段(例如名称,地址等),我想验证/检查它们是否为空与否。如果所有内容都已填满,我想将 Enter 按钮设置为启用。如果任何一个字段都是空的,我想禁用 Enter按钮。
我已在下面编写了我的代码,但即使我的所有字段都已填满,我的按钮 仍未启用。我正在使用一堆布尔变量来确定是否满足条件。
我不确定我的错误在哪里,因为我的应用程序运行正常但不是我想要的结果,如果我的一个或所有字段为空,则会禁用Enter按钮。
我的变数:
boolean filledName, filledAddress = false; //These variables will determine if my fields are empty or not
EditText name, address;
Button btnEnter;
我的onCreate:
protected void onCreate(Bundle savedInstanceState) {
...
//Get views from layout xml via IDs
name = (EditText) findViewById(R.id.name);
address = (EditText) findViewById(R.id.address);
btnEnter = (Button) findViewById(R.id.btnEnter);
btnEnter.setEnabled(false); //initialize the Enter button to be disabled on Activity creation
...
我在onCreate中添加了文本更改的监听器:
name.addTextChangedListener (new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2){
if (!(name.toString().trim().isEmpty()))
filledName = true; //if name field is NOT empty, filledName value is true
}
....
//other implemented abstract codes here
});
address.addTextChangedListener (new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2){
if (!(address.toString().trim().isEmpty()))
filledAddress = true; //if address field is NOT empty, filledAddress value is true
}
....
//other implemented abstract codes here
});
//This should set the Enter button to enabled once all the boolean conditions are met
//but for some reason it's not working
if (nameFilled == true && addressFilled == true)
btnEnter.setEnabled(true);
} //end of onCreate()
答案 0 :(得分:2)
在创建活动时,只会调用一次onCreate()。因此,启用按钮的代码在开始时运行一次(当字段为空时),并且在实际创建这些EditTexts时再也看不到。这些行应该放在一个单独的方法中,可以从每个TextChangedListeners中调用。例如,有一个新方法
private void checkFields() {
if (nameFilled == true && addressFilled == true)
btnEnter.setEnabled(true);
}
和你的听众
name.addTextChangedListener (new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2){
if (!(name.toString().trim().isEmpty()))
filledName = true; //if name field is NOT empty, filledName value is true
checkFields();
}
(显然在另一个中做同样的事情)
答案 1 :(得分:2)
我不建议您保存布尔值,因为当字段再次为空时,您还必须将其更改为protected void onCreate(Bundle savedInstanceState) {
//......
name.addTextChangedListener (new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2){
checkRequiredFields();
}
});
address.addTextChangedListener (new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2){
checkRequiredFields();
}
});
//......
}
private void checkRequiredFields() {
if (!name.getText().toString().isEmpty() && !address.getText().toString().isEmpty()) {
btnEnter.setEnabled(true);
} else {
btnEnter.setEnabled(false);
}
}
。
我认为最好这样做:
{{1}}
答案 2 :(得分:0)
我也遇到了一些像你这样的问题,过了一会儿我就放弃了。它不会禁用你的按钮,但是如果编辑文本是空的,它不会让你去另一个活动。不知道这是你正在寻找的,但我希望它会帮助你! Juan Cruz Soler是对的,不要保存布尔值。你可以这样做:
protected void onCreate(Bundle savedInstanceState) {
name = (EditText) findViewById(R.id.name);
address = (EditText) findViewById(R.id.address);
btnEnter = (Button) findViewById(R.id.btnEnter);
btnEnter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if ( name.getText().toString().trim().equals("") ||
address.getText().toString().trim().equals("")){
Toast.makeText(getApplicationContext(), "No data input", Toast.LENGTH_LONG).show();
}else {
Intent intent = new Intent(getApplicationContext(), theActivityYouWantToGo.class);
startActivity(intent);
}
}