编辑文本字段为空时禁用按钮

时间:2013-12-19 13:20:25

标签: android android-edittext

我有两个文本字段和一个Button。我想禁用Button,除非两个EditText-Fields都不为空。我在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);
        }
    }
}

如果我开始活动,则会被禁用。但是,如果我输入某些内容,它有时会启用,有时则不启用..我只想在两个“编辑 - 文本字段”都不为空时启用该按钮。

7 个答案:

答案 0 :(得分:12)

你的问题在这里:

//set listeners
        editText1.addTextChangedListener(textWatcher);
        editText1.addTextChangedListener(textWatcher);

您没有将textWatcher设置为editText2,因此如果您在editText1内写字,则总是检查条件

答案 1 :(得分:6)

我知道这已经过时了,但请记住,只需使用.isEmpty(),您就可以只添加一个空格,按钮就会自动启用。

改为使用s1.trim().isEmpty || s2.trim().isEmpty()

或者,您可以这样做:

String s1 = editText1.getText().toString().trim() String s2 = editText2.getText().toString().trim()

然后检查.isEmpty()

我不知道,但是你想要这样做,而且这个答案很可能无关紧要但是我想我只是指出这一点进行。

答案 2 :(得分: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);
        }

}

答案 3 :(得分:3)

另一种方法是

b.setEnabled(!s1.trim().isEmpty() && !s2.trim().isEmpty());

答案 4 :(得分:2)

您可以更短的时间解决此问题:

@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);
}

答案 5 :(得分:0)

而不是这个

 if(s1.equals("") && s2.equals(""))
    {
        b.setEnabled(false);
    }

试试这个

 if(s1.isEmpty() || s2.isEmpty())
    {
        b.setEnabled(false);
    }

更改&&的所有验证条件这到||

答案 6 :(得分:0)

我的方式是:

  1. button setEnabled(false)

  2. 我使用TextWatcher来监听文本更改和更新状态 afterTextChanged功能

  3. 中的按钮

    这是我的代码:

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