Editext InputLayout.setError仅在第一次显示

时间:2016-07-12 15:47:49

标签: android android-studio android-edittext android-textinputlayout

我尝试通过window if (this.name === "__blank__") {/*do stuff*/} else {/*do other stuff*/} validate输入Editext,并TextWatcher显示error。         问题是,InputLayout下次输入无效时,InputLayout错误不再显示。

我只想验证输入的端口,我希望它从2000到65535开始,我的布局显示为对话框。

InputLayout error is showing at the first time only

我已经尝试将其更改为,但它会起作用。

final Dialog dialog = new Dialog(PanelActivity.this,R.style.CustomDialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(true);
dialog.setContentView(R.layout.port_layout);
final EditText ePort = (EditText) dialog.findViewById(R.id.input_port);
final TextInputLayout inputLayoutPort = (TextInputLayout)dialog.findViewById(R.id.input_layout_port);

ePort.addTextChangedListener(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) {
                if(s.length() > 1){
                    if(Integer.parseInt(String.valueOf(s)) < 2000 || Integer.parseInt(String.valueOf(s)) > 65535){
                        inputLayoutPort.setError("Port must be 2000 to 65535.");
                        //Inputted port is incorrect
                    }else{
                        inputLayoutPort.setErrorEnabled(false);
                        .... //Inputted port is correct
                    }
                }else{
                    inputLayoutPort.setError("Port must be 2000 to 65535.");
                    //Inputted port is incorrect
                }
            }

            @Override
            public void afterTextChanged(Editable s) {}
        });

dialog.show();

但是,它仍然是第一次只显示输入无效。

这是我第一次使用InputLayout,我只是按照我发现的教程,但似乎我错过了一些东西,我无法弄清楚。

更新 以下代码适用于我的Inputlayout xml

... //onTextChanged
        if(s.length() > 1){
            if(Integer.parseInt(String.valueOf(s)) < 2000 || Integer.parseInt(String.valueOf(s)) > 65535){
                inputLayoutPort.setError("Port must be 2000 to 65535.");
                inputLayoutPort.setErrorEnabled(true);
                //Inputted port is incorrect
            }else{
                inputLayoutPort.setErrorEnabled(false);
                .... //Inputted port is correct
            }
        }else{
            inputLayoutPort.setError("Port must be 2000 to 65535.");
            inputLayoutPort.setErrorEnabled(true);
            //Inputted port is incorrect
        }

2 个答案:

答案 0 :(得分:1)

我最近发现了同样的问题。

使用inputLayoutPort.setErrorEnabled(false)使TextInputLayout处于无法再次重新启用错误的状态。我不确定这是否是预期的行为,因为文档不清楚。

这样做的正确方法似乎只是调用inputLayoutPort.setError(null),因为这样可以清除错误。这个记录的行为,所以我接受了。

答案 1 :(得分:0)

根据您的代码,您可以将onTextChanged()简化为:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

    inputLayoutPort.setError("Port must be 2000 to 65535.");

    if(s.length() > 1 && !(Integer.parseInt(String.valueOf(s)) < 2000 || Integer.parseInt(String.valueOf(s)) > 65535)) {
        inputLayoutPort.setError(null);
    }
}

所以,我设置了错误消息&#34; Port must be 2000 to 65535.&#34;每次edittext中的文本都会发生变化。然后,结合您的两个条件s.length() > 1s lies between 2000 and 65535,我通过将错误设置为null来删除错误消息。