EditText-এ Max Length সেট করা (XML + Programmatic)
Android-এ EditText-এ ক্যারেক্টার লিমিট সেট করার সবচেয়ে সহজ উপায় হল XML-এ android:maxLength অ্যাট্রিবিউট ব্যবহার করা। প্রোগ্রাম্যাটিক্যালি করার জন্য InputFilter.LengthFilter ব্যবহার করুন।
পদ্ধতি ১: XML-এ maxLength (সর্বোত্তম ও সিম্পল)
<EditText
android:id="@+id/etLimited"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="সর্বোচ্চ ১০ ক্যারেক্টার"
android:maxLength="10"
android:inputType="text" />
এই এক লাইনই যথেষ্ট। ব্যবহারকারী ১০ ক্যারেক্টার টাইপ করলে আরও টাইপ করতে পারবে না।
পদ্ধতি ২: প্রোগ্রাম্যাটিক্যালি (InputFilter.LengthFilter)
EditText editText = findViewById(R.id.etLimited);
int maxLength = 10;
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
পদ্ধতি ৩: একাধিক ফিল্টার কম্বাইন করা
যদি ইতিমধ্যে অন্য ফিল্টার থাকে (যেমন maxLength + custom validation):
InputFilter[] existingFilters = editText.getFilters();
InputFilter[] newFilters = Arrays.copyOf(existingFilters, existingFilters.length + 1);
newFilters[newFilters.length - 1] = new InputFilter.LengthFilter(10);
editText.setFilters(newFilters);
সম্পূর্ণ উদাহরণ: MainActivity.java
package com.example.edittextmaxlength;
import android.os.Bundle;
import android.text.InputFilter;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText etXmlLimit = findViewById(R.id.etXmlLimit);
EditText etProgrammaticLimit = findViewById(R.id.etProgrammaticLimit);
EditText etCombined = findViewById(R.id.etCombined);
// পদ্ধতি ২: প্রোগ্রাম্যাটিক্যালি ১৫ ক্যারেক্টার লিমিট
etProgrammaticLimit.setFilters(new InputFilter[]{new InputFilter.LengthFilter(15)});
// পদ্ধতি ৩: কম্বাইনড ফিল্টার (লিমিট + কাস্টম ভ্যালিডেশন)
InputFilter[] baseFilters = etCombined.getFilters();
InputFilter[] combinedFilters = new InputFilter[baseFilters.length + 2];
System.arraycopy(baseFilters, 0, combinedFilters, 0, baseFilters.length);
combinedFilters[baseFilters.length] = new InputFilter.LengthFilter(20);
combinedFilters[baseFilters.length + 1] = (source, start, end, dest, dstart, dend) -> {
// কাস্টম ভ্যালিডেশন: শুধু অক্ষর ও সংখ্যা অনুমোদন
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (!Character.isLetterOrDigit(c) && c != ' ') {
return ""; // ব্লক করুন
}
}
return null; // অনুমোদন
};
etCombined.setFilters(combinedFilters);
// লাইভ ক্যারেক্টার কাউন্ট দেখান (ঐচ্ছিক)
etXmlLimit.addTextChangedListener(new TextWatcher() {
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override public void onTextChanged(CharSequence s, int start, int before, int count) {
// কাউন্ট আপডেট করতে পারেন
}
@Override public void afterTextChanged(Editable s) {}
});
}
}
activity_main.xml (সম্পূর্ণ লেআউট)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="EditText Max Length Demo"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginBottom="24dp"/>
<!-- পদ্ধতি ১: XML maxLength -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="১. XML maxLength (১০ ক্যারেক্টার)"
android:textStyle="bold"
android:layout_marginTop="16dp"/>
<EditText
android:id="@+id/etXmlLimit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="সর্বোচ্চ ১০ ক্যারেক্টার"
android:maxLength="10"
android:inputType="text" />
<!-- পদ্ধতি ২: Programmatic LengthFilter -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="২. Programmatic LengthFilter (১৫ ক্যারেক্টার)"
android:textStyle="bold"
android:layout_marginTop="16dp"/>
<EditText
android:id="@+id/etProgrammaticLimit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="সর্বোচ্চ ১৫ ক্যারেক্টার (কোডে সেট)" />
<!-- পদ্ধতি ৩: Combined Filters -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="৩. Combined: LengthFilter (২০) + Alphanumeric Only"
android:textStyle="bold"
android:layout_marginTop="16dp"/>
<EditText
android:id="@+id/etCombined"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="অক্ষর/সংখ্যা, সর্বোচ্চ ২০" />
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.edittextmaxlength">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.EditTextMaxLength">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
InputFilter.LengthFilter-এর আচরণ
- পেস্ট (Paste) করার সময়ও লিমিট এনফোর্স করে
- ইমোজি, স্পেশাল ক্যারেক্টার সব গिनाয় (UTF-16 কোড ইউনিট বেসে)
- সরাসরি
setText()কল করলে ফিল্টার বাইপাস হয় (প্রোগ্রাম্যাটিক সেটে লিমিট চেক করতে হয় ম্যানুয়ালি)
উন্নত: ক্যারেক্টার কাউন্ট UI দেখানো
// TextInputLayout-এ counterEnabled ব্যবহার করুন (Material Components)
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="বায়ো"
app:counterEnabled="true"
app:counterMaxLength="160">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
এটি অটোমেটিক্যালি "১৫/১৬০" টাইপ কাউন্টার দেখাবে এবং লিমিট এনফোর্স করবে।
সাধারণ সমস্যা ও সমাধান
| সমস্যা | সমাধান |
|---|---|
| maxLength কাজ করে না | InputType="text" বা অন্য সেট আছে কিনা চেক করুন, কিছু inputType konflikt করতে পারে |
| Paste করলে বেশি চলে যায় | LengthFilter পেস্টেও কাজ করে; কাস্টম ফিল্টার থাকলে সেটি চেক করুন |
| setText() দিয়ে লিমিট বাইপাস হয় | setText()-এর আগে length চেক করুন: if (text.length() > max) text = text.substring(0, max); |
| ইমোজি ২ ক্যারেক্টার গिनाয় | সারোগেট পেয়ার (surrogate pairs) — এটি ঠিকই, UTF-16 এ ২ code unit |