EditText
অ্যান্ড্রয়েডে পাঠ্যের দৈর্ঘ্য সীমাবদ্ধ করার সর্বোত্তম উপায় কী ?
এক্সএমএল মাধ্যমে এটি করার কোন উপায় আছে?
EditText
অ্যান্ড্রয়েডে পাঠ্যের দৈর্ঘ্য সীমাবদ্ধ করার সর্বোত্তম উপায় কী ?
এক্সএমএল মাধ্যমে এটি করার কোন উপায় আছে?
উত্তর:
maxLength
সম্পত্তি এখনও কাজ করে।
android:maxLength
সমতুল্য সচেতন থাকুন InputFilter.LengthFilter
, সুতরাং যখন প্রোগ্রামিকভাবে এটির ফিল্টার পরিবর্তন করা হয়, আপনি এর এক্সএমএল ফিল্টারটিও সংশোধন করেছেন।
setFilters
বন্ধ করবে android:maxLength
, কারণ এটি এক্সএমএল দ্বারা সেট করা ফিল্টারটিকে ওভাররাইট করে। অন্য কথায়, আপনি যদি কোনও ফিল্টার প্রোগ্রামক্রমে সেট করেন তবে আপনাকে অবশ্যই সেগুলি সমস্ত প্রোগ্রামিয়েটিকভাবে সেট করতে হবে।
একটি পাঠ্য দৃশ্যের সর্বাধিক দৈর্ঘ্য সীমাবদ্ধ করতে একটি ইনপুট ফিল্টার ব্যবহার করুন।
TextView editEntryView = new TextView(...);
InputFilter[] filterArray = new InputFilter[1];
filterArray[0] = new InputFilter.LengthFilter(8);
editEntryView.setFilters(filterArray);
InputFilter
। এটি android:maxlength
এক্সএমএল ফাইলে ওভাররাইড করে, সুতরাং আমাদের LengthFilter
এইভাবে যুক্ত করা দরকার ।
EditText editText = new EditText(this);
int maxLength = 3;
editText.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLength)});
TextWatcher
।
ইতিমধ্যে যে ব্যক্তিদের একটি কাস্টম ইনপুট ফিল্টারকে ব্যবহার করেন এবং একটি নোট এছাড়াও সর্বোচ্চ দৈর্ঘ্য সীমিত করতে চাই:
আপনি যখন কোডটিতে ইনপুট ফিল্টারগুলি অর্পণ করেন তখন একটি সেট সহ সমস্ত পূর্ববর্তী সেট ইনপুট ফিল্টার সাফ হয়ে যায় android:maxLength
। আমরা কোনও পাসওয়ার্ড ক্ষেত্রে অনুমতি দিই না এমন কয়েকটি অক্ষরের ব্যবহার রোধ করতে একটি কাস্টম ইনপুট ফিল্টার ব্যবহার করার চেষ্টা করার সময় আমি এটি খুঁজে পেয়েছি। সেট ফিল্টারগুলির সাহায্যে সেই ফিল্টারটি স্থাপনের পরে সর্বোচ্চ দৈর্ঘ্যটি আর পরিলক্ষিত হয়নি। সমাধানটি ছিল প্রোগ্রামলমে ম্যাক্সেলেন্থ এবং আমার কাস্টম ফিল্টার এক সাথে সেট করা। এটার মতো কিছু:
myEditText.setFilters(new InputFilter[] {
new PasswordCharFilter(), new InputFilter.LengthFilter(20)
});
আমার এই সমস্যাটি হয়েছে এবং আমি বিবেচনা করছি যে আমরা ইতিমধ্যে সেট করা ফিল্টারগুলি না হারিয়ে প্রোগ্রামালিকভাবে এটি করার একটি সুস্পষ্টভাবে ব্যাখ্যা করছি।
এক্সএমএলে দৈর্ঘ্য নির্ধারণ:
যেমন গৃহীত উত্তরটি সঠিকভাবে বলেছে, আপনি যদি ভবিষ্যতে আর পরিবর্তন করতে পারবেন না এমন একটি সম্পাদনা পাঠের একটি নির্দিষ্ট দৈর্ঘ্য সংজ্ঞায়িত করতে চান তবে আপনার সম্পাদনা পাঠের এক্সএমএলে সংজ্ঞা দিন:
android:maxLength="10"
প্রোগ্রামটিমে দৈর্ঘ্য নির্ধারণ করা হচ্ছে
প্রোগ্রামালমে দৈর্ঘ্য সেট করতে আপনাকে এটি একটি মাধ্যমে নির্ধারণ করতে হবে InputFilter
। তবে আপনি যদি একটি নতুন ইনপুটফিল্টার তৈরি করেন এবং সেট করে রাখেন তবে EditText
আপনি ইতিমধ্যে অন্য সমস্ত সংজ্ঞায়িত ফিল্টার (যেমন ম্যাক্সলাইনস, ইনপুট টাইপ, ইত্যাদি) হারাবেন যা আপনি এক্সএমএল এর মাধ্যমে বা প্রোগ্রামক্রমে যুক্ত করেছেন।
সুতরাং এটি ভুল :
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)
আপনি এটি অর্জনের আরেকটি উপায় হ'ল এক্সএমএল ফাইলে নিম্নলিখিত সংজ্ঞাটি যুক্ত করা:
<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 টি অক্ষরে সীমাবদ্ধ করবে ।
মেটিরিয়াল.ও থেকে , আপনি এর 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);
দ্রষ্টব্য: অভ্যন্তরীণভাবে, সম্পাদনা পাঠ্য ও পাঠ্যদর্শন android:maxLength
এক্সএমএল এর মানটিকে বিশ্লেষণ করে InputFilter.LengthFilter()
এটি প্রয়োগ করতে ব্যবহার করুন ।
দেখুন: টেক্সটভিউ.জভা # 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 });
}
}
}
এটি এক্সএমএলে সহজ উপায়:
android:maxLength="4"
যদি আপনাকে xML সম্পাদনা-পাঠ্যে 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) ব্যবহার করার চেষ্টা করি, ফলাফল হয়, এটি কেবল 212 স্থান '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)
এটি এক্সএমএলে সহজ উপায়:
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()]));
}
}