EditText
एंड्रॉइड में टेक्स्ट की लंबाई को सीमित करने का सबसे अच्छा तरीका क्या है?
क्या xml के माध्यम से ऐसा करने का कोई तरीका है?
EditText
एंड्रॉइड में टेक्स्ट की लंबाई को सीमित करने का सबसे अच्छा तरीका क्या है?
क्या xml के माध्यम से ऐसा करने का कोई तरीका है?
जवाबों:
maxLength
संपत्ति अभी भी काम करता है।
android:maxLength
यह बराबर है InputFilter.LengthFilter
, इसलिए जब प्रोग्रामेटिक रूप से यह फ़िल्टर बदल रहा है, तो आपने इसके XML फ़िल्टर को भी संशोधित कर दिया है।
setFilters
करना बंद android:maxLength
कर देगी , क्योंकि यह XML द्वारा निर्धारित फिल्टर को ओवरराइट कर देता है। दूसरे शब्दों में, यदि आप प्रोग्रामेटिक रूप से कोई फिल्टर सेट करते हैं, तो आपको उन्हें सभी प्रोग्रामेटिक रूप से सेट करना होगा।
पाठ दृश्य की अधिकतम लंबाई को सीमित करने के लिए एक इनपुट फ़िल्टर का उपयोग करें।
TextView editEntryView = new TextView(...);
InputFilter[] filterArray = new InputFilter[1];
filterArray[0] = new InputFilter.LengthFilter(8);
editEntryView.setFilters(filterArray);
InputFilter
। यह android:maxlength
xml फ़ाइल में ओवरराइड करता है, इसलिए हमें LengthFilter
इस तरह से जोड़ना होगा।
EditText editText = new EditText(this);
int maxLength = 3;
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLength)});
TextWatcher
।
जो लोग पहले से ही एक कस्टम इनपुट फिल्टर और भी उपयोग कर रहे हैं के लिए एक नोट अधिकतम लंबाई सीमित करना चाहते हैं:
जब आप कोड में इनपुट फ़िल्टर असाइन करते हैं, तो पहले से सेट किए गए इनपुट फ़िल्टर साफ़ हो जाते हैं, जिसमें एक सेट भी शामिल है android:maxLength
। मुझे यह पता चला जब कुछ वर्णों के उपयोग को रोकने के लिए एक कस्टम इनपुट फ़िल्टर का उपयोग करने का प्रयास किया गया, जिसे हम पासवर्ड फ़ील्ड में अनुमति नहीं देते हैं। उस फ़िल्टर को सेटफिल्टर्स के साथ सेट करने के बाद maxLength अब देखी नहीं गई थी। इसका समाधान था मैक्सिमम और मेरे कस्टम फ़िल्टर को एक साथ प्रोग्रामेटिक रूप से सेट करना। कुछ इस तरह:
myEditText.setFilters(new InputFilter[] {
new PasswordCharFilter(), new InputFilter.LengthFilter(20)
});
मुझे यह समस्या हुई है और मुझे लगता है कि हम पहले से सेट किए गए फिल्टर को खोए बिना इस प्रोग्राम को करने का एक अच्छा तरीका याद कर रहे हैं।
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)
किसी और के लिए यह सोचकर कि इसे कैसे हासिल किया जाए, यहां मेरी विस्तारित 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
, निश्चित रूप से काम भी करती हैं।
गोटो 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 });
}
}
//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()});
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)
एक और तरीका है कि आप इसे प्राप्त कर सकते हैं 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 वर्णों तक सीमित कर देगा ।
से 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'
एक्सएमएल
android:maxLength="10"
प्रोग्राम के रूप में:
int maxLength = 10;
InputFilter[] filters = new InputFilter[1];
filters[0] = new InputFilter.LengthFilter(maxLength);
yourEditText.setFilters(filters);
नोट: आंतरिक रूप से, EditText और TextView android:maxLength
XML के मूल्य को पार्स करते हैं और InputFilter.LengthFilter()
इसे लागू करने के लिए उपयोग करते हैं।
देखें: TextView.java # L1564
यह एक कस्टम एडिटटेक्स्ट क्लास है जो लंबाई फिल्टर को अन्य फिल्टर के साथ रहने की अनुमति देता है। टिम गैलाघेर के जवाब के लिए धन्यवाद (नीचे)
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 });
}
}
}
यह सरल तरीका है 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" />
यह ठीक काम करता है ...
android:maxLength="10"
यह केवल 10
पात्रों को स्वीकार करेगा ।
जावा के लिए यह प्रोग्रामेटिक रूप से आज़माएं :
myEditText(new InputFilter[] {new InputFilter.LengthFilter(CUSTOM_MAX_LEN)});
myEditText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(CUSTOM_MAX_LEN)});
मैंने बहुत सारे अच्छे समाधान देखे थे, लेकिन मैं एक ऐसा विचार देना चाहता हूं जो अधिक संपूर्ण और उपयोगकर्ता के अनुकूल समाधान के रूप में हो, जिसमें शामिल हैं:
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 'के रूप में सम्मिलित करता है, मूल हाइलाइट पर नहीं। मैं चाहूंगा कि कोई इसका हल निकाले।
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)
यह सरल तरीका है 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()]));
}
}