在启用按钮之前验证所有EditText字段?

时间:2017-09-30 22:09:42

标签: android validation android-edittext

我有几个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()

3 个答案:

答案 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);
            }

        }