Android에서 EditText의 텍스트 길이 제한


Answers

입력 필터를 사용하여 텍스트보기의 최대 길이를 제한하십시오.

TextView editEntryView = new TextView(...);
InputFilter[] filterArray = new InputFilter[1];
filterArray[0] = new InputFilter.LengthFilter(8);
editEntryView.setFilters(filterArray);
Question

Android에서 EditText 의 텍스트 길이를 제한하는 가장 좋은 방법은 무엇입니까?

xml을 통해이를 수행 할 수있는 방법이 있습니까?




나는 많은 훌륭한 솔루션을 보았지만 다음과 같은보다 완벽하고 사용자 친화적 인 솔루션으로 생각합니다.

1, 제한 길이.
2, 더 입력하면 콜백을하여 토스트를 시작합니다.
3, 커서 중간 또는 꼬리 수 있습니다.
4, 사용자는 문자열을 붙여 넣어 입력 할 수 있습니다.
5, 항상 넘침 입력을 버리고 원점을 유지하십시오.

public class LimitTextWatcher implements TextWatcher {

    public interface IF_callback{
        void callback(int left);
    }

    public IF_callback if_callback;

    EditText editText;
    int maxLength;

    int cursorPositionLast;
    String textLast;
    boolean bypass;

    public LimitTextWatcher(EditText editText, int maxLength, IF_callback if_callback) {

        this.editText = editText;
        this.maxLength = maxLength;
        this.if_callback = if_callback;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        if (bypass) {

            bypass = false;

        } else {

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(s);
            textLast = stringBuilder.toString();

            this.cursorPositionLast = editText.getSelectionStart();
        }
    }

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

    }

    @Override
    public void afterTextChanged(Editable s) {
        if (s.toString().length() > maxLength) {

            int left = maxLength - s.toString().length();

            bypass = true;
            s.clear();

            bypass = true;
            s.append(textLast);

            editText.setSelection(this.cursorPositionLast);

            if (if_callback != null) {
                if_callback.callback(left);
            }
        }

    }

}


edit_text.addTextChangedListener(new LimitTextWatcher(edit_text, MAX_LENGTH, new LimitTextWatcher.IF_callback() {
    @Override
    public void callback(int left) {
        if(left <= 0) {
            Toast.makeText(MainActivity.this, "input is full", Toast.LENGTH_SHORT).show();
        }
    }
}));

내가 실패한 이유는 사용자가 현재 입력의 일부를 강조 표시하고 매우 긴 문자열을 붙여 넣으려고하면 강조 표시를 복원하는 방법을 모르겠다는 것입니다.

최대 길이는 10으로 설정하고 사용자는 '12345678'을 입력하고 '345'는 하이라이트로 표시하고 제한을 초과하는 '0000'문자열을 붙여 넣으려고합니다.

원본 상태를 복원하기 위해 edit_text.setSelection (시작 = 2, 끝 = 4)을 사용하려고하면 원본 강조가 아닌 '12 345 678 '으로 2 개의 공백을 삽입합니다. 누군가가 그걸 풀어주고 싶습니다.




이것은 잘 작동합니다 ...

android:maxLength="10"

이 경우 10 자까지만 허용됩니다.




이것을 달성하는 방법을 궁금해하는 다른 사람을 위해, 여기 확장 된 EditText 클래스 EditTextNumeric 있습니다.

.setMaxLength(int) - 최대 자릿수를 설정합니다.

.setMaxValue(int) - 최대 정수 값을 제한합니다.

.setMin(int) - 최소 정수 값을 제한합니다.

.getValue() - 정수 값을 얻습니다.

import android.content.Context;
import android.text.InputFilter;
import android.text.InputType;
import android.widget.EditText;

public class EditTextNumeric extends EditText {
    protected int max_value = Integer.MAX_VALUE;
    protected int min_value = Integer.MIN_VALUE;

    // constructor
    public EditTextNumeric(Context context) {
        super(context);
        this.setInputType(InputType.TYPE_CLASS_NUMBER);
    }

    // checks whether the limits are set and corrects them if not within limits
    @Override
    protected void onTextChanged(CharSequence text, int start, int before, int after) {
        if (max_value != Integer.MAX_VALUE) {
            try {
                if (Integer.parseInt(this.getText().toString()) > max_value) {
                    // change value and keep cursor position
                    int selection = this.getSelectionStart();
                    this.setText(String.valueOf(max_value));
                    if (selection >= this.getText().toString().length()) {
                        selection = this.getText().toString().length();
                    }
                    this.setSelection(selection);
                }
            } catch (NumberFormatException exception) {
                super.onTextChanged(text, start, before, after);
            }
        }
        if (min_value != Integer.MIN_VALUE) {
            try {
                if (Integer.parseInt(this.getText().toString()) < min_value) {
                    // change value and keep cursor position
                    int selection = this.getSelectionStart();
                    this.setText(String.valueOf(min_value));
                    if (selection >= this.getText().toString().length()) {
                        selection = this.getText().toString().length();
                    }
                    this.setSelection(selection);
                }
            } catch (NumberFormatException exception) {
                super.onTextChanged(text, start, before, after);
            }
        }
        super.onTextChanged(text, start, before, after);
    }

    // set the max number of digits the user can enter
    public void setMaxLength(int length) {
        InputFilter[] FilterArray = new InputFilter[1];
        FilterArray[0] = new InputFilter.LengthFilter(length);
        this.setFilters(FilterArray);
    }

    // set the maximum integer value the user can enter.
    // if exeeded, input value will become equal to the set limit
    public void setMaxValue(int value) {
        max_value = value;
    }
    // set the minimum integer value the user can enter.
    // if entered value is inferior, input value will become equal to the set limit
    public void setMinValue(int value) {
        min_value = value;
    }

    // returns integer value or 0 if errorous value
    public int getValue() {
        try {
            return Integer.parseInt(this.getText().toString());
        } catch (NumberFormatException exception) {
            return 0;
        }
    }
}

사용 예 :

final EditTextNumeric input = new EditTextNumeric(this);
input.setMaxLength(5);
input.setMaxValue(total_pages);
input.setMinValue(1);

EditText 적용되는 다른 모든 메소드와 속성은 물론 작동합니다.




이미 사용자 정의 입력 필터를 사용하고 있고 최대 길이를 제한하려는 사람들에게 보내는 메모입니다.

코드에서 입력 필터를 지정하면 이전에 설정된 모든 입력 필터가 지워집니다. 여기에는 android:maxLength 설정된 필터가 포함됩니다. 우리가 암호 필드에서 허용하지 않는 일부 문자의 사용을 막기 위해 사용자 지정 입력 필터를 사용하려고 시도했을 때 이것을 발견했습니다. setFilters로 그 필터를 설정하면 (자), maxLength는 더이상 관찰되지 않습니다. 해결 방법은 프로그래밍 방식으로 maxLength와 사용자 정의 필터를 함께 설정하는 것이 었습니다. 이 같은:

myEditText.setFilters(new InputFilter[] {
        new PasswordCharFilter(), new InputFilter.LengthFilter(20)
});



이를 달성 할 수있는 또 다른 방법은 XML 파일에 다음 정의를 추가하는 것입니다.

<EditText
    android:id="@+id/input"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:maxLength="6"
    android:hint="@string/hint_gov"
    android:layout_weight="1"/>

이것은 EditText 위젯의 최대 길이를 6 자로 제한합니다.




//Set Length filter. Restricting to 10 characters only
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH)});

//Allowing only upper case characters
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

//Attaching multiple filters
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH), new InputFilter.AllCaps()});



Links