在保持焦点的同时禁用EditText输入

时间:2018-06-13 09:07:19

标签: android android-edittext

我有一个EditText字段,变量名valueInputField

我听的是文本输入的变化,我想要实现的是在输入过程中,当输入格式DOESN&T匹配正则表达式时,我想停止显示更多输入,但保持字段聚焦和放大。用户能够在键盘上键入,只是不会对该字段产生任何实际效果。

@OnTextChanged(R.id.value_input)
protected void onTextChanged(CharSequence charSequence) {
   String inputChars = charSequence.toString().trim();
   // if doesn't match regular expression, stop showing more inputs
   if (!inputChars.matches(MY_REGEXP)) {
      // this doesn't achieve what I need.
      valueInputField.setInputType(0)
   }
}

我试过上面的方式,它没有用。如何实现我的需求?

6 个答案:

答案 0 :(得分:3)

也许你应该尝试低于逻辑

maxLength=inputChars.length
if (!inputChars.matches(MY_REGEXP)) {
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLength)});
}

以上程序将设置EditText的最大长度,当它与regexp不匹配时。

答案 1 :(得分:2)

您必须在textView中添加一个InputFilter:

这是一个例子:

editText.filters = arrayOf(object: InputFilter {
   override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence {
      if (Regex("[0-9]*").matches(source!!)) {
         return source
      } else {
         return source.subSequence(start, end-1)
      }
   }
})

每次调用editText中的输入时都会调用此过滤器方法。您可以在匹配正则表达式时返回源,否则,您可以返回源的subSequence,而不插入最后一个char。

代码示例在Kotlin中,翻译不应该给你任何问题:)

答案 2 :(得分:2)

您已经在做setInputType(InputType.TYPE_NULL)。但它应该与setEnabled(false)一起使用才能使其有效。

这也会改变背景颜色。强烈推荐它,因为它为用户提供了一条不接受输入的线索。但是,如果您愿意,可以将其更改为setBackgroundColor(Color.TRANSPARENT)

如果要隐藏光标,请添加setCursorVisible(false)

或者,您可以使用afterTextChanged代替onTextChanged,以便您可以操作文本。

答案 3 :(得分:1)

禁用编辑文本的输入类型在焦点或正在编辑时无法正常工作。将inout类型设置为null后,视图将开始接收keypress回调方法。因此,有类变量来验证字段并取消按下的键。 这里有示例代码。

public class SplashActivity extends AppCompatActivity{

    EditText valueInputField;
    private  boolean allowValueField2Edit = true;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ....

        valueInputField.addTextChangedListener(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) {

                String inputChars = charSequence.toString().trim();
                // if doesn't match regular expression, stop showing more inputs
                if (!inputChars.matches(MY_REGEXP)) {

                    // this doesn't achieve what I need.
                    valueInputField.setInputType(InputType.null);
                    allowValueField2Edit = false;
                }

            }

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

      //Once you set the input type to none fore edit control, on Key lister will receive callbacks
        valueInputField.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
             //Here, you can add your custom logic to have key actions.
            //retrun false will have key effect, return true 
                return !allowValueField2Edit;
            }
        });

希望这会有所帮助......

答案 4 :(得分:1)

如果要停止编辑文本中的建议,则应尝试以下操作:

editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

要在任何情况下再次启用,请使用以下命令:

editText.setInputType(InputType. TYPE_CLASS_TEXT);

以下是输入阈值大小的示例,这里也应使用正则表达式:

editText.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()< threshold){
                editText.setInputType(InputType. TYPE_CLASS_TEXT);
            }
            if(s.length()>= threshold){
                editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

答案 5 :(得分:0)

伪代码:

  1. 等待输入文字与您的模式匹配
  2. 找到匹配项时,设置过滤器
  3. 过滤器将需要在每次按键时返回相同的上一个字符串

源代码:

editText.addTextChangedListener(new TextWatcher() {
    ...
    @Override
    public void afterTextChanged(Editable editable) {
        String text = editable.toString();

        // STEP 1
        if(text.matches(myRegex) && !flag) {

            // make sure that this code block is executed only once
            flag = true;

            // STEP 2
            // when match is found, always return the same string
            // therefore disabling further editing of the editText field
            editText.setFilters(new InputFilter[]{
                new InputFilter() {
                    @Override
                    public CharSequence filter(CharSequence charSequence, int i, int i1, 
                            Spanned spanned, int i2, int i3) {
                        // STEP 3
                        return spanned.subSequence(i2, i3);
                    }
                }
            });
        }
    }
});

设置输入过滤器时,请注意正确的方法。 Please check this SO answer by Steven Byle