How do I use InputFilter to limit characters in an EditText in Android?

后端 未结 20 1516
慢半拍i
慢半拍i 2020-11-22 04:23

I want to restrict the chars to 0-9, a-z, A-Z and spacebar only. Setting inputtype I can limit to digits but I cannot figure out the ways of Inputfilter looking through the

20条回答
  •  甜味超标
    2020-11-22 04:58

    This is an old thread, but the purposed solutions all have issues (depending on device / Android version / Keyboard).

    DIFFERENT APPROACH

    So eventually I went with a different approach, instead of using the InputFilter problematic implementation, I am using TextWatcher and the TextChangedListener of the EditText.

    FULL CODE (EXAMPLE)

    editText.addTextChangedListener(new TextWatcher() {
    
        @Override
        public void afterTextChanged(Editable editable) {
            super.afterTextChanged(editable);
    
            String originalText = editable.toString();
            int originalTextLength = originalText.length();
            int currentSelection = editText.getSelectionStart();
    
            // Create the filtered text
            StringBuilder sb = new StringBuilder();
            boolean hasChanged = false;
            for (int i = 0; i < originalTextLength; i++) {
                char currentChar = originalText.charAt(i);
                if (isAllowed(currentChar)) {
                    sb.append(currentChar);
                } else {
                    hasChanged = true;
                    if (currentSelection >= i) {
                        currentSelection--;
                    }
                }
            }
    
            // If we filtered something, update the text and the cursor location
            if (hasChanged) {
                String newText = sb.toString();
                editText.setText(newText);
                editText.setSelection(currentSelection);
            }
        }
    
        private boolean isAllowed(char c) {
            // TODO: Add the filter logic here
            return Character.isLetter(c) || Character.isSpaceChar(c);
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // Do Nothing
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // Do Nothing
        }
    });
    

    The reason InputFilter is not a good solution in Android is since it depends on the keyboard implementation. The Keyboard input is being filtered before the input is passed to the EditText. But, because some keyboards have different implementations for the InputFilter.filter() invocation, this is problematic.

    On the other hand TextWatcher does not care about the keyboard implementation, it allows us to create a simple solution and be sure it will work on all devices.

提交回复
热议问题