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

Android 编辑文本字段为空时禁用按钮,android,android-edittext,Android,Android Edittext,我有两个文本字段和一个按钮。我想禁用按钮,除非两个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.

我有两个文本字段和一个按钮。我想禁用按钮,除非两个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);
        }
    }
}
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);
}
如果我启动该活动,它将被禁用。但是如果我输入一些东西,它有时启用,有时不启用。。如果两个编辑文本字段都不是空的,我只想启用该按钮。

而不是此按钮

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

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

将所有验证条件从&&this更改为| |

您的方法
checkfields对于您的操作来说,remptyvalue
太复杂了,请尝试执行以下操作:

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

}
你的问题是:

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

您没有将textWatcher设置为editText2,因此,如果您在editText1中写入,您总是在检查条件。我知道这很旧,但请记住,只需使用
,isEmpty()
将只允许您添加一个空格,并且按钮将自动启用

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

或者,您可以执行以下操作:

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

然后只需检查
.isEmpty()


我不知道,不管你想怎么做,这个答案很可能是无关紧要的,但我想我应该指出这一点。

另一种方法是

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

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

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

我的方式是:

  • 按钮设置已启用(错误)

  • 我使用
    TextWatcher
    来监听文本更改和更新的状态 后文本更改功能中的按钮

  • 这是我的密码:

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

    而且他真的应该使用
    s1.isEmpty()
    not
    s1.equals(“”
    ,虽然这是为了性能和清晰度,而不是正确性。我用| |替换了&&但现在整个按钮都处于禁用状态time@Andros建议的方法是最简单的方法。如果需要使用b.setEnabled(!s1.isEmpty()&&!s2.isEmpty()),我也会这样做;另外,PostextChanged可能对您更有效我读了很多次代码,空条件不是最好的,但它还可以,所以问题出在另一个地方:)它在开始时不起作用,我在两个字段中键入它保持禁用状态,然后我必须在字段1中再次键入某物,然后启用它