আমি চরগুলি কেবল 0-9, এজেড, এজেড এবং স্পেসবারে সীমাবদ্ধ রাখতে চাই। ইনপুট টাইপ সেট করা আমি অঙ্কগুলিতে সীমাবদ্ধ করতে পারি তবে ডক্সের মাধ্যমে ইনপুটফিল্টারের উপায়গুলি খুঁজে বের করতে পারি না।
আমি চরগুলি কেবল 0-9, এজেড, এজেড এবং স্পেসবারে সীমাবদ্ধ রাখতে চাই। ইনপুট টাইপ সেট করা আমি অঙ্কগুলিতে সীমাবদ্ধ করতে পারি তবে ডক্সের মাধ্যমে ইনপুটফিল্টারের উপায়গুলি খুঁজে বের করতে পারি না।
উত্তর:
আমি এটি অন্য ফোরামে খুঁজে পেয়েছি। চ্যাম্পের মতো কাজ করে।
InputFilter filter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (!Character.isLetterOrDigit(source.charAt(i))) {
return "";
}
}
return null;
}
};
edit.setFilters(new InputFilter[] { filter });
InputFilter
এসগুলি অ্যান্ড্রয়েড সংস্করণগুলিতে কিছুটা জটিল যা অভিধানের পরামর্শগুলি প্রদর্শন করে। আপনি কখনও কখনও একটি পেতে SpannableStringBuilder
, কখনও কখনও একটি প্লেইন String
মধ্যে source
প্যারামিটার।
নিম্নলিখিত InputFilter
কাজ করা উচিত। এই কোড উন্নত নির্দ্বিধায়!
new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
if (source instanceof SpannableStringBuilder) {
SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
for (int i = end - 1; i >= start; i--) {
char currentChar = source.charAt(i);
if (!Character.isLetterOrDigit(currentChar) && !Character.isSpaceChar(currentChar)) {
sourceAsSpannableBuilder.delete(i, i+1);
}
}
return source;
} else {
StringBuilder filteredStringBuilder = new StringBuilder();
for (int i = start; i < end; i++) {
char currentChar = source.charAt(i);
if (Character.isLetterOrDigit(currentChar) || Character.isSpaceChar(currentChar)) {
filteredStringBuilder.append(currentChar);
}
}
return filteredStringBuilder.toString();
}
}
}
String replacement = source.subSequence(start, end).toString(); return replacement.replaceAll("[^A-Za-z0-9_\\-@]", "");
source instanceof SpannableStringBuilder
, লিখে এবি আমাকে দেয় অ্যাবের যখন পূর্ববর্তী উত্তর চেষ্টা। ভাগ্যক্রমে নীচে @ ফ্লোরিয়ান সমাধান ব্যবহার করে আমি এটির আশপাশে কাজ করতে সক্ষম হয়েছি।
আরো সহজ:
<EditText
android:inputType="text"
android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm" />
","
মাঝে মধ্যে দেওয়ার দরকার নেই । আপনি এর মতো কিছু ব্যবহার করতে পারেন"0123456789qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM"
imeOptions="actionNext"
etc. ইত্যাদি
পোস্ট করা উত্তরগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি। আমি আমার নিজস্ব সমাধান নিয়ে এসেছি:
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
boolean keepOriginal = true;
StringBuilder sb = new StringBuilder(end - start);
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (isCharAllowed(c)) // put your condition here
sb.append(c);
else
keepOriginal = false;
}
if (keepOriginal)
return null;
else {
if (source instanceof Spanned) {
SpannableString sp = new SpannableString(sb);
TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
return sp;
} else {
return sb;
}
}
}
private boolean isCharAllowed(char c) {
return Character.isLetterOrDigit(c) || Character.isSpaceChar(c);
}
}
editText.setFilters(new InputFilter[] { filter });
EditText
ইতিমধ্যে নিজস্ব ফিল্টার থাকতে পারে, যেমন দৈর্ঘ্য ফিল্টার। সুতরাং কেবলমাত্র ফিল্টারগুলি ওভাররাইড করার পরিবর্তে আপনি সম্ভবত ইতিমধ্যে বিদ্যমান ফিল্টারগুলিতে আপনার ফিল্টারগুলি যুক্ত করতে চান।
এটি আপনার প্রয়োজন এবং এটি খুব সহজ 100% এর কাজটি ব্যবহার করুন।
<EditText
android:inputType="textFilter"
android:digits="@string/myAlphaNumeric" />
স্ট্রিং.এক্সএমএল এ
<string name="myAlphaNumeric">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</string>
ইনপুট টাইপ বিশেষ অক্ষর এড়াতে
public static InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String blockCharacterSet = "~#^|$%*!@/()-'\":;,?{}=!$^';,?×÷<>{}€£¥₩%~`¤♡♥_|《》¡¿°•○●□■◇◆♧♣▲▼▶◀↑↓←→☆★▪:-);-):-D:-(:'(:O 1234567890";
if (source != null && blockCharacterSet.contains(("" + source))) {
return "";
}
return null;
}
};
আপনি নীচের মত আপনার সম্পাদনা পাঠ্যে ফিল্টার সেট করতে পারেন
edtText.setFilters(new InputFilter[] { filter });
গৃহীত উত্তরের পাশাপাশি, এটি ব্যবহার করা সম্ভব যেমন: কেবলমাত্র বড় হাতের অক্ষর (এবং সংখ্যা) গ্রহণ করার জন্য android:inputType="textCapCharacters"
একটি গুণ হিসাবে <EditText>
।
কোনও কারণে অ্যান্ড্রয়েড.টেক্সট.লগিনফিল্টার শ্রেণীর নির্মাতা প্যাকেজ-স্কোপড, তাই আপনি সরাসরি এটি প্রসারিত করতে পারবেন না (যদিও এটি এই কোডটির সাথে সমান হবে)। তবে আপনি লগইনফিল্টারটি বাড়িয়ে দিতে পারেন ser ব্যবহারকারীর নাম ফিল্টারজেনেরিক! তারপরে আপনার কেবল এটি রয়েছে:
class ABCFilter extends LoginFilter.UsernameFilterGeneric {
public UsernameFilter() {
super(false); // false prevents not-allowed characters from being appended
}
@Override
public boolean isAllowed(char c) {
if ('A' <= c && c <= 'C')
return true;
if ('a' <= c && c <= 'c')
return true;
return false;
}
}
এটি আসলে নথিভুক্ত নয়, তবে এটি মূল স্বচ্ছল অংশ, এবং উত্সটি সোজা । আমি এটি কিছুক্ষণের জন্য ব্যবহার করছি, এখনও পর্যন্ত কোনও সমস্যা নেই, যদিও আমি স্বীকার করি যে আমি স্প্যানিয়েবলগুলি জড়িত কোনও জটিল করার চেষ্টা করি নি।
এটি ঠিক, এক্সএমএল লেআউটটিতে এটি ব্যবহার করে এটি ঠিক করার সেরা উপায় way
<EditText
android:inputType="text"
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" />
ঠিক যেমনটি ফ্লোরিয়ান ফ্রেহলিচ নির্দেশ করেছেন, এটি পাঠ্য দর্শনের জন্যও ভাল কাজ করে।
<TextView
android:inputType="text"
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" />
কেবলমাত্র সাবধানতার একটি শব্দ, উইলের বর্ণিত অক্ষরগুলি android:digits
কেবল প্রদর্শিত হবে, সুতরাং কোনও অক্ষর সেট না মিস করার জন্য কেবল সতর্কতা অবলম্বন করুন :)
inputType
ফিল্টারিং প্রভাবিত করে না।
এই সহজ সমাধানটি আমার পক্ষে কাজ করেছিল যখন আমি কোনও সম্পাদনা পাঠ্যে খালি স্ট্রিংগুলিতে প্রবেশ করা থেকে ব্যবহারকারীদের আটকাতে পারি। আপনি অবশ্যই আরও অক্ষর যুক্ত করতে পারেন:
InputFilter textFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence c, int arg1, int arg2,
Spanned arg3, int arg4, int arg5) {
StringBuilder sbText = new StringBuilder(c);
String text = sbText.toString();
if (text.contains(" ")) {
return "";
}
return c;
}
};
private void setTextFilter(EditText editText) {
editText.setFilters(new InputFilter[]{textFilter});
}
আপনি যদি ইনপুটফিল্টার সাবক্লাস করেন তবে আপনি নিজের ইনপুটফিল্টার তৈরি করতে পারেন যা কোনও অ-আলফা-সংখ্যাসূচক অক্ষরগুলিকে ফিল্টার করতে পারে।
ইনপুটফিল্টার ইন্টারফেসের একটি পদ্ধতি রয়েছে filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
এবং এটি আপনাকে সম্পাদনা পাঠের ক্ষেত্রে কোন অক্ষরগুলি প্রবেশ করানো হয়েছিল সে সম্পর্কে আপনাকে জানতে প্রয়োজনীয় সমস্ত তথ্য সরবরাহ করে।
একবার আপনি নিজের ইনপুটফিল্টার তৈরি করার পরে সেট সেট ফিল্টারগুলি (...) এ কল করে আপনি এডিট টেক্সট এ নিয়োগ করতে পারেন।
http://developer.android.com/references/android/text/InputFilter.html#filter(java.lang.CarSequence , int, int, android.text.Spned, int, int)
অভিধানের পরামর্শগুলিকে সঠিকভাবে পরিচালনা করতে, অন্যান্য লোকেরা যে স্প্যান স্টাফগুলিকে মোকাবেলা করেছে তা উপেক্ষা করে আমি নিম্নলিখিত কোডের কাজটি পেয়েছি।
প্রস্তাবটি বাড়ার সাথে সাথে উত্সটি বৃদ্ধি পেয়েছে তাই আমাদের কিছু প্রত্যাবর্তনের আগে এটি কতটা অক্ষর বাস্তবে আমাদের প্রতিস্থাপনের প্রত্যাশা করে তা দেখতে হবে।
আমাদের যদি কোনও অবৈধ অক্ষর না থাকে তবে নালটি ফিরুন যাতে ডিফল্ট প্রতিস্থাপন ঘটে।
অন্যথায় আমাদের স্ট্রিং থেকে বৈধ অক্ষরগুলি বের করতে হবে যা প্রকৃতপক্ষে সম্পাদনা পাঠ্য স্থানে স্থাপন করা হবে।
InputFilter filter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
boolean includesInvalidCharacter = false;
StringBuilder stringBuilder = new StringBuilder();
int destLength = dend - dstart + 1;
int adjustStart = source.length() - destLength;
for(int i=start ; i<end ; i++) {
char sourceChar = source.charAt(i);
if(Character.isLetterOrDigit(sourceChar)) {
if(i >= adjustStart)
stringBuilder.append(sourceChar);
} else
includesInvalidCharacter = true;
}
return includesInvalidCharacter ? stringBuilder : null;
}
};
এডিটেক্সটে শব্দ রোধ করতে। আপনি যে কোনও সময় ব্যবহার করতে পারেন এমন একটি শ্রেণি তৈরি করুন।
public class Wordfilter implements InputFilter
{
@Override
public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) {
// TODO Auto-generated method stub
boolean append = false;
String text = source.toString().substring(start, end);
StringBuilder str = new StringBuilder(dest.toString());
if(dstart == str.length())
{
append = true;
str.append(text);
}
else
str.replace(dstart, dend, text);
if(str.toString().contains("aaaaaaaaaaaa/*the word here*/aaaaaaaa"))
{
if(append==true)
return "";
else
return dest.subSequence(dstart, dend);
}
return null;
}
}
প্রথমে এতে যুক্ত করুন strings.xml
:
<string name="vin_code_mask">0123456789abcdefghjklmnprstuvwxyz</string>
এক্সএমএল :
android:digits="@string/vin_code_mask"
কোটলিনে কোড :
edit_text.filters += InputFilter { source, start, end, _, _, _ ->
val mask = getString(R.string.vin_code_mask)
for (i in start until end) {
if (!mask.contains(source[i])) {
return@InputFilter ""
}
}
null
}
অদ্ভুত, তবে এটি এমুলেটারের নরম কীবোর্ডে অদ্ভুতভাবে কাজ করে।
সতর্কবাণী! নিম্নলিখিত কোডটি সফ্টওয়্যার কীবোর্ডের জন্য অঙ্কগুলি বাদে সমস্ত অক্ষর এবং অন্যান্য চিহ্নগুলিকে ফিল্টার করবে। স্মার্টফোনে কেবলমাত্র ডিজিটাল কীবোর্ড প্রদর্শিত হবে।
edit_text.keyListener = DigitsKeyListener.getInstance(context.getString(R.string.vin_code_mask))
আমি সাধারণত সেট maxLength
, filters
, inputType
।
এটি একটি পুরানো থ্রেড, তবে উদ্দেশ্যযুক্ত সমাধানগুলিতে সমস্ত সমস্যা রয়েছে (ডিভাইস / অ্যান্ড্রয়েড সংস্করণ / কিবোর্ডের উপর নির্ভর করে)।
বিবিধ পদ্ধতি
তাই অবশেষে আমি এর পরিবর্তে ব্যবহার করার, একটি ভিন্ন পদ্ধতির সঙ্গে গিয়েছিলাম InputFilter
সমস্যাযুক্ত বাস্তবায়ন, আমি ব্যবহার করছি TextWatcher
এবং TextChangedListener
এরEditText
।
সম্পূর্ণ কোড (উদাহরণ)
editText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable editable) {
super.afterTextChanged(editable);
String originalText = editable.toString();
int originalTextLength = originalText.length();
int currentSelection = editText.getSelectionStart();
// Create the filtered text
StringBuilder sb = new StringBuilder();
boolean hasChanged = false;
for (int i = 0; i < originalTextLength; i++) {
char currentChar = originalText.charAt(i);
if (isAllowed(currentChar)) {
sb.append(currentChar);
} else {
hasChanged = true;
if (currentSelection >= i) {
currentSelection--;
}
}
}
// If we filtered something, update the text and the cursor location
if (hasChanged) {
String newText = sb.toString();
editText.setText(newText);
editText.setSelection(currentSelection);
}
}
private boolean isAllowed(char c) {
// TODO: Add the filter logic here
return Character.isLetter(c) || Character.isSpaceChar(c);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// Do Nothing
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Do Nothing
}
});
কারণটি InputFilter
অ্যান্ড্রয়েডে কোনও ভাল সমাধান নয় কারণ এটি কীবোর্ড প্রয়োগের উপর নির্ভর করে। ইনপুটটি পাস করার আগে কীবোর্ড ইনপুট ফিল্টার করা হচ্ছে EditText
। তবে, কিছু কীবোর্ডের InputFilter.filter()
অনুরোধের জন্য বিভিন্ন বাস্তবায়ন রয়েছে , এটি সমস্যাযুক্ত।
অন্যদিকে TextWatcher
কীবোর্ড প্রয়োগের বিষয়ে চিন্তা করে না, এটি আমাদের একটি সহজ সমাধান তৈরি করতে এবং এটি সমস্ত ডিভাইসে কার্যকর হবে তা নিশ্চিত হতে দেয়।
onTextChanged
কেবল একটি প্রয়োজন public void
তা সামনে।
এটিকে সহজ রাখতে আমি এরকম কিছু করেছি:
edit_text.filters = arrayOf(object : InputFilter {
override fun filter(
source: CharSequence?,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence? {
return source?.subSequence(start, end)
?.replace(Regex("[^A-Za-z0-9 ]"), "")
}
})
এইভাবে আমরা উত্স স্ট্রিংয়ের নতুন অংশে সমস্ত অযাচিত অক্ষরগুলিকে খালি স্ট্রিংয়ের সাথে প্রতিস্থাপন করছি।
edit_text
পরিবর্তনশীল EditText
বস্তুর আমরা উল্লেখ করা হয়।
কোড লেখা আছে kotlin
।
এটি ব্যবহার করা সম্ভব setOnKeyListener
। এই পদ্ধতিতে, আমরা ইনপুট কাস্টমাইজ করতে পারি edittext
!
এইভাবে আমি সম্পাদনা পাঠ্যে নাম ক্ষেত্রের জন্য ফিল্টার তৈরি করেছি ((প্রথম বর্ণটি সিএপিএস is
public void setNameFilter() {
InputFilter filter = new InputFilter() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (dend == 0) {
if (Character.isSpaceChar(source.charAt(i)) ||
!Character.isAlphabetic(source.charAt(i))) {
return Constants.Delimiter.BLANK;
} else {
return String.valueOf(source.charAt(i)).toUpperCase();
}
} else if (Character.isSpaceChar(source.charAt(i)) &&
String.valueOf(dest).endsWith(Constants.Delimiter.ONE_SPACE)) {
return Constants.Delimiter.BLANK;
} else if ((!Character.isSpaceChar(source.charAt(i)) &&
!Character.isAlphabetic(source.charAt(i)))) {
return Constants.Delimiter.BLANK;
}
}
return null;
}
};
editText.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(Constants.Length.NAME_LENGTH)});
}
কোটলিনে আমারও একই উত্তর:
/**
* Returns the filter of the editText'es CharSequence value when [filterType] is:
* 1 -> letters; 2 -> letters and digits; 3 -> digits;
* 4 -> digits and dots
*/
class InputFilterAlphanumeric(private val filterType: Int): InputFilter {
override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence {
(source as? SpannableStringBuilder)?.let {sourceAsSpannableBuilder ->
for (i in (end - 1) downTo start) {
val currentChar = source[i]
when(filterType) {
1 -> {
if (!currentChar.isLetter() && !currentChar.isWhitespace()) {
sourceAsSpannableBuilder.delete(i, i + 1)
}
}
2 -> {
if (!currentChar.isLetterOrDigit() && !currentChar.isWhitespace()) {
sourceAsSpannableBuilder.delete(i, i + 1)
}
}
3 -> {
if (!currentChar.isDigit()) {
sourceAsSpannableBuilder.delete(i, i + 1)
}
}
4 -> {
if (!currentChar.isDigit() || !currentChar.toString().contains(".")) {
sourceAsSpannableBuilder.delete(i, i + 1)
}
}
}
}
return source
} ?: run {
val filteredStringBuilder = StringBuilder()
for (i in start until end) {
val currentChar = source?.get(i)
when(filterType) {
1 -> {
if (currentChar?.isLetter()!! || currentChar.isWhitespace()) {
filteredStringBuilder.append(currentChar)
}
}
2 -> {
if (currentChar?.isLetterOrDigit()!! || currentChar.isWhitespace()) {
filteredStringBuilder.append(currentChar)
}
}
3 -> {
if (currentChar?.isDigit()!!) {
filteredStringBuilder.append(currentChar)
}
}
4 -> {
if (currentChar?.isDigit()!! || currentChar.toString().contains(".")) {
filteredStringBuilder.append(currentChar)
}
}
}
}
return filteredStringBuilder
}
}
}
এবং একটি এক্সটেনশন ফাংশন সহ ক্লাস পান:
fun EditText.filterByDataType(filterType: Int) {
this.filters = arrayOf<InputFilter>(InputFilterAlphanumeric(filterType))
}