Android में EditText की टेक्स्ट लंबाई को सीमित करने का सबसे अच्छा तरीका क्या है


703

EditTextएंड्रॉइड में टेक्स्ट की लंबाई को सीमित करने का सबसे अच्छा तरीका क्या है?

क्या xml के माध्यम से ऐसा करने का कोई तरीका है?


1
मैं अपने EditText के लिए अधिकतम वर्ण सेट करना चाहता था। पहले यह स्पष्ट नहीं था कि पाठ की लंबाई सीमा एक ही बात थी। (बस एक और भ्रमित यात्री के लिए एक नोट)।
केट्रेडल पिलोन

सही जवाब यहाँ है : stackoverflow.com/a/19222238/276949 । यह उत्तर लंबाई को सीमित करता है और सीमा को हिट करने के बाद एक बफर को लगातार भरने से रोकता है, इसलिए आपके बैकस्पेस कुंजी को ठीक से काम करने की अनुमति देता है।
मार्टिन कोन्सेनी 3

जवाबों:


1381

प्रलेखन

उदाहरण

android:maxLength="10"

26
डी 'ओह! मेरे साथ भी ठीक वैसा ही हुआ था। मैं कोड देख रहा था, और वहाँ कोई setMaxLength विधि नहीं है।
22

1
यहाँ चेक क्या करता है? यह सिर्फ इस पृष्ठ से जोड़ता है।
को नींद क्या है

5
@ आप गलत हैं। maxLengthसंपत्ति अभी भी काम करता है।
आशीषुध

6
ध्यान रखें कि android:maxLengthयह बराबर है InputFilter.LengthFilter, इसलिए जब प्रोग्रामेटिक रूप से यह फ़िल्टर बदल रहा है, तो आपने इसके XML फ़िल्टर को भी संशोधित कर दिया है।
mr5

20
जो लोग कहते हैं कि यह काम नहीं करता है, इस बात से अवगत रहें कि कॉलिंग काम setFiltersकरना बंद android:maxLengthकर देगी , क्योंकि यह XML द्वारा निर्धारित फिल्टर को ओवरराइट कर देता है। दूसरे शब्दों में, यदि आप प्रोग्रामेटिक रूप से कोई फिल्टर सेट करते हैं, तो आपको उन्हें सभी प्रोग्रामेटिक रूप से सेट करना होगा।
इयान न्यूज़न

339

पाठ दृश्य की अधिकतम लंबाई को सीमित करने के लिए एक इनपुट फ़िल्टर का उपयोग करें।

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

6
यह बहुत उपयोगी है अगर किसी ने पहले से ही कुछ बनाया है InputFilter। यह android:maxlengthxml फ़ाइल में ओवरराइड करता है, इसलिए हमें LengthFilterइस तरह से जोड़ना होगा।
सेबलिस

मुझे लगता है कि आपका उत्तर सबसे अच्छा उत्तर है, क्योंकि यह अधिक गतिशील है, +1
मुहनाद ए। अलहिरी

197
EditText editText = new EditText(this);
int maxLength = 3;    
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLength)});

यह उसी तरह है जैसे android xml के साथ करता है।
निकोलस टायलर

4
मैं न्यूनतम लंबाई कैसे निर्धारित कर सकता हूं?
अखिला मदारी

@ एखिलामदरी, शायद साथ TextWatcher
कूलमाइंड

65

जो लोग पहले से ही एक कस्टम इनपुट फिल्टर और भी उपयोग कर रहे हैं के लिए एक नोट अधिकतम लंबाई सीमित करना चाहते हैं:

जब आप कोड में इनपुट फ़िल्टर असाइन करते हैं, तो पहले से सेट किए गए इनपुट फ़िल्टर साफ़ हो जाते हैं, जिसमें एक सेट भी शामिल है android:maxLength। मुझे यह पता चला जब कुछ वर्णों के उपयोग को रोकने के लिए एक कस्टम इनपुट फ़िल्टर का उपयोग करने का प्रयास किया गया, जिसे हम पासवर्ड फ़ील्ड में अनुमति नहीं देते हैं। उस फ़िल्टर को सेटफिल्टर्स के साथ सेट करने के बाद maxLength अब देखी नहीं गई थी। इसका समाधान था मैक्सिमम और मेरे कस्टम फ़िल्टर को एक साथ प्रोग्रामेटिक रूप से सेट करना। कुछ इस तरह:

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

5
आप मौजूदा फ़िल्टर्स को पहले प्राप्त कर सकते हैं, इनपुटफिल्टर [] मौजूदा फ़िल्टर = editText.getFilters (); फिर इस मौजूदा फ़िल्टर के साथ अपने फ़िल्टर को जोड़ें
subair_a

39
TextView tv = new TextView(this);
tv.setFilters(new InputFilter[]{ new InputFilter.LengthFilter(250) });

7
ज़रूर, केवल Android के लिए
VAdaihiep

27

मुझे यह समस्या हुई है और मुझे लगता है कि हम पहले से सेट किए गए फिल्टर को खोए बिना इस प्रोग्राम को करने का एक अच्छा तरीका याद कर रहे हैं।

XML में लंबाई सेट करना:

जैसा कि स्वीकार किया गया उत्तर सही ढंग से बताता है, यदि आप एक EditText की निश्चित लंबाई को परिभाषित करना चाहते हैं, जिसे आप भविष्य में आगे नहीं बदलेंगे, बस अपने EditText XML में परिभाषित करें:

android:maxLength="10" 

प्रोग्राम को लंबाई निर्धारित करना

लंबाई को प्रोग्रामेटिक रूप से सेट करने के लिए आपको इसे एक के माध्यम से सेट करना होगा InputFilter। लेकिन अगर आप एक नया InputFilter बनाते हैं और उसे सेट करते हैंEditText तो आप अन्य सभी पहले से परिभाषित फ़िल्टर (जैसे maxLines, inputType, आदि) खो देंगे, जिसे आपने XML या प्रोग्राम के माध्यम से जोड़ा होगा।

तो यह गलत है :

editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLength)});

पहले जोड़े गए फ़िल्टर को खोने से बचने के लिए आपको उन फ़िल्टर को प्राप्त करने की आवश्यकता है, नया जोड़ें (इस मामले में अधिकतम गति), और फ़िल्टर को वापस सेट करें EditText करें:

जावा

InputFilter[] editFilters = editText.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = new InputFilter.LengthFilter(maxLength); 
editText.setFilters(newFilters);

कोटलिन ने हालांकि सभी के लिए इसे आसान बना दिया है, आपको पहले से मौजूद लोगों के लिए फ़िल्टर जोड़ने की भी आवश्यकता है लेकिन आप इसे एक साधारण से प्राप्त कर सकते हैं:

editText.filters += InputFilter.LengthFilter(maxLength)

23

किसी और के लिए यह सोचकर कि इसे कैसे हासिल किया जाए, यहां मेरी विस्तारित 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, निश्चित रूप से काम भी करती हैं।


1
बेहतर होगा कि हम इसे xml लेआउट में जोड़ दें। मैं इस के साथ त्रुटि हो रही है एक्सएमएल का उपयोग करते समय की वजह से: android.view.InflateException: बाइनरी एक्सएमएल फ़ाइल लाइन # 47: त्रुटि बढ़ा-चढ़ाकर वर्ग com.passenger.ucabs.utils.EditTextNumeric
शिहाब उद्दीन

@Martynas शिहाब_नटर्न की तरह ही कोई त्रुटि है?
प्राणशर्मा

17

गोटो 10 के अवलोकन के कारण, मैंने अधिकतम लंबाई निर्धारित करने के साथ अन्य फिल्टर को खोने से बचाने के लिए निम्न कोड को एक साथ रखा:

/**
 * This sets the maximum length in characters of an EditText view. Since the
 * max length must be done with a filter, this method gets the current
 * filters. If there is already a length filter in the view, it will replace
 * it, otherwise, it will add the max length filter preserving the other
 * 
 * @param view
 * @param length
 */
public static void setMaxLength(EditText view, int length) {
    InputFilter curFilters[];
    InputFilter.LengthFilter lengthFilter;
    int idx;

    lengthFilter = new InputFilter.LengthFilter(length);

    curFilters = view.getFilters();
    if (curFilters != null) {
        for (idx = 0; idx < curFilters.length; idx++) {
            if (curFilters[idx] instanceof InputFilter.LengthFilter) {
                curFilters[idx] = lengthFilter;
                return;
            }
        }

        // since the length filter was not part of the list, but
        // there are filters, then add the length filter
        InputFilter newFilters[] = new InputFilter[curFilters.length + 1];
        System.arraycopy(curFilters, 0, newFilters, 0, curFilters.length);
        newFilters[curFilters.length] = lengthFilter;
        view.setFilters(newFilters);
    } else {
        view.setFilters(new InputFilter[] { lengthFilter });
    }
}

3
आप कोड को थोड़ा अद्यतन करना चाह सकते हैं। आबंटित सरणी को आकार में curFilters.length + 1 होने की आवश्यकता है और जब आप newFilters बनाते हैं, तो आपने नए आवंटित सरणी में "यह" सेट नहीं किया। InputFilter newFilters [] = new InputFilter [curFilters.length + 1]; System.arraycopy (curFilters, 0, newFilters, 0, curFilters.length); this.setFilters (newFilters);
JavaCoderEx

15
//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()});

12

Xml

android:maxLength="10"

जावा:

InputFilter[] editFilters = editText.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = new InputFilter.LengthFilter(maxLength);
editText.setFilters(newFilters);

Kotlin:

editText.filters += InputFilter.LengthFilter(maxLength)

8

एक और तरीका है कि आप इसे प्राप्त कर सकते हैं 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 वर्णों तक सीमित कर देगा ।


6

से material.io , तो आप उपयोग कर सकते हैं TextInputEditTextके साथ संयुक्त TextInputLayout:

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    app:counterMaxLength="1000"
    app:passwordToggleEnabled="false">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/edit_text"
        android:hint="@string/description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:maxLength="1000"
        android:gravity="top|start"
        android:inputType="textMultiLine|textNoSuggestions"/>

</com.google.android.material.textfield.TextInputLayout>

आप एक पासवर्ड को एडिट कर सकते हैं।

पासवर्ड उदाहरण

या आप एक काउंटर के साथ / बिना पाठ की लंबाई को सीमित कर सकते हैं:

काउंटर उदाहरण

निर्भरता:

implementation 'com.google.android.material:material:1.1.0-alpha02'

6

एक्सएमएल

android:maxLength="10"

प्रोग्राम के रूप में:

int maxLength = 10;
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter.LengthFilter(maxLength);
yourEditText.setFilters(filters);

नोट: आंतरिक रूप से, EditText और TextView android:maxLengthXML के मूल्य को पार्स करते हैं और InputFilter.LengthFilter()इसे लागू करने के लिए उपयोग करते हैं।

देखें: TextView.java # L1564


2

यह एक कस्टम एडिटटेक्स्ट क्लास है जो लंबाई फिल्टर को अन्य फिल्टर के साथ रहने की अनुमति देता है। टिम गैलाघेर के जवाब के लिए धन्यवाद (नीचे)

import android.content.Context;
import android.text.InputFilter;
import android.util.AttributeSet;
import android.widget.EditText;


public class EditTextMultiFiltering extends EditText{

    public EditTextMultiFiltering(Context context) {
        super(context);
    }

    public EditTextMultiFiltering(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextMultiFiltering(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setMaxLength(int length) {
        InputFilter curFilters[];
        InputFilter.LengthFilter lengthFilter;
        int idx;

        lengthFilter = new InputFilter.LengthFilter(length);

        curFilters = this.getFilters();
        if (curFilters != null) {
            for (idx = 0; idx < curFilters.length; idx++) {
                if (curFilters[idx] instanceof InputFilter.LengthFilter) {
                    curFilters[idx] = lengthFilter;
                    return;
                }
            }

            // since the length filter was not part of the list, but
            // there are filters, then add the length filter
            InputFilter newFilters[] = new InputFilter[curFilters.length + 1];
            System.arraycopy(curFilters, 0, newFilters, 0, curFilters.length);
            newFilters[curFilters.length] = lengthFilter;
            this.setFilters(newFilters);
        } else {
            this.setFilters(new InputFilter[] { lengthFilter });
        }
    }
}

2

यह सरल तरीका है xml में:

android:maxLength="4"

यदि u को xml edit-text में 4 वर्ण सेट करने की आवश्यकता है, तो इसका उपयोग करें

<EditText
    android:id="@+id/edtUserCode"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLength="4"
    android:hint="Enter user code" />


2

जावा के लिए यह प्रोग्रामेटिक रूप से आज़माएं :

myEditText(new InputFilter[] {new InputFilter.LengthFilter(CUSTOM_MAX_LEN)});

1
आप विधि को कॉल करना भूल गए ताकि यह दिखना चाहिए:myEditText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(CUSTOM_MAX_LEN)});
StevenTB

1

मैंने बहुत सारे अच्छे समाधान देखे थे, लेकिन मैं एक ऐसा विचार देना चाहता हूं जो अधिक संपूर्ण और उपयोगकर्ता के अनुकूल समाधान के रूप में हो, जिसमें शामिल हैं:

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) का उपयोग करने का प्रयास करता हूं, तो इसका परिणाम यह है कि यह केवल 2 स्थान को '12 345 678 'के रूप में सम्मिलित करता है, मूल हाइलाइट पर नहीं। मैं चाहूंगा कि कोई इसका हल निकाले।


1

आप android:maxLength="10"EditText में उपयोग कर सकते हैं । (यहाँ सीमा 10 वर्ण तक है)


0

Kotlin:

edit_text.filters += InputFilter.LengthFilter(10)

ZTE Blade A520अजीब प्रभाव है। जब आप 10 से अधिक प्रतीक टाइप करते हैं (उदाहरण के लिए, 15), EditTextपहले 10 दिखाता है, लेकिन अन्य 5 दिखाई नहीं देते हैं और पहुंच योग्य नहीं हैं। लेकिन जब आप प्रतीकों को हटाते हैं Backspace, तो यह पहले सही 5 प्रतीकों को हटाता है और फिर शेष 10 को हटाता है। इस व्यवहार को दूर करने के लिए एक समाधान का उपयोग करें :

android:inputType="textNoSuggestions|textVisiblePassword"
android:maxLength="10"

या यह:

android:inputType="textNoSuggestions"

या यह, यदि आप सुझाव चाहते हैं:

private class EditTextWatcher(private val view: EditText) : TextWatcher {
    private var position = 0
    private var oldText = ""

    override fun afterTextChanged(s: Editable?) = Unit

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        oldText = s?.toString() ?: ""
        position = view.selectionStart
    }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        val newText = s?.toString() ?: ""
        if (newText.length > 10) {
            with(view) {
                setText(oldText)
                position = if (start > 0 && count > 2) {
                    // Text paste in nonempty field.
                    start
                } else {
                    if (position in 1..10 + 1) {
                        // Symbol paste in the beginning or middle of the field.
                        position - 1
                    } else {
                        if (start > 0) {
                            // Adding symbol to the end of the field.
                            start - 1
                        } else {
                            // Text paste in the empty field.
                            0
                        }
                    }
                }
                setSelection(position)
            }
        }
    }
}

// Usage:
editTextWatcher = EditTextWatcher(view.edit_text)
view.edit_text.addTextChangedListener(editTextWatcher)

0

यह सरल तरीका है xml में:

android:maxLength="@{length}"

इसे प्रोग्रामेटिक रूप से सेट करने के लिए आप निम्न फ़ंक्शन का उपयोग कर सकते हैं

public static void setMaxLengthOfEditText(EditText editText, int length) {
    InputFilter[] filters = editText.getFilters();
    List arrayList = new ArrayList();
    int i2 = 0;
    if (filters != null && filters.length > 0) {
        int length = filters.length;
        int i3 = 0;
        while (i2 < length) {
            Object obj = filters[i2];
            if (obj instanceof LengthFilter) {
                arrayList.add(new LengthFilter(length));
                i3 = 1;
            } else {
                arrayList.add(obj);
            }
            i2++;
        }
        i2 = i3;
    }
    if (i2 == 0) {
        arrayList.add(new LengthFilter(length));
    }
    if (!arrayList.isEmpty()) {
        editText.setFilters((InputFilter[]) arrayList.toArray(new InputFilter[arrayList.size()]));
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.