অ্যান্ড্রয়েডের সম্পাদনা পাঠের অক্ষর সীমাবদ্ধ করতে আমি কীভাবে ইনপুটফিল্টার ব্যবহার করব?


171

আমি চরগুলি কেবল 0-9, এজেড, এজেড এবং স্পেসবারে সীমাবদ্ধ রাখতে চাই। ইনপুট টাইপ সেট করা আমি অঙ্কগুলিতে সীমাবদ্ধ করতে পারি তবে ডক্সের মাধ্যমে ইনপুটফিল্টারের উপায়গুলি খুঁজে বের করতে পারি না।

উত্তর:


186

আমি এটি অন্য ফোরামে খুঁজে পেয়েছি। চ্যাম্পের মতো কাজ করে।

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 });

58
আসলে এটি নতুন অ্যান্ড্রয়েডগুলিতে (4.0+ এর মতো) তেমন কাজ করে না। তারা কীবোর্ডের উপরে অভিধানের পরামর্শগুলি উপস্থাপন করে। যখন আপনি একটি সাধারণ শব্দ টাইপ করেন (আসুন "" বলুন) তারপরে এই ফিল্টারটির জন্য একটি অবৈধ চরিত্র (বলুন, "-") পুরো শব্দটি মুছে ফেলা হয় এবং আপনি অন্য অক্ষরগুলি টাইপ করার পরেও (এমনকি "ব্লাহ" এর মতো অনুমোদিত শব্দও ব্যবহার করেন) ফিল্টার "" প্রদান করে এবং কোনও অক্ষর ফিল্ডে প্রদর্শিত হবে না। কারণ এই পদ্ধতিটি "দ্য-ব্লাহ" এর সাথে উত্স প্যারামিটারে একটি স্প্যানিয়েবল স্ট্রিংবিল্ডার পায় এবং পুরো ইনপুট স্ট্রিংয়ের বিস্তৃত প্রারম্ভ / শেষ পরামিতি ... আরও ভাল সমাধানের জন্য আমার উত্তর দেখুন।
asukasz Sromek

4
এই উদাহরণে, যেখানে এটি "" ফিরিয়ে দেয়, আমি মনে করি এটি প্রদর্শিত হওয়া পাঠ্যটি ফিরিয়ে আনবে। অর্থাত্ আপনার অবৈধ অক্ষরগুলি মুছে ফেলা উচিত এবং আপনার প্রদর্শিত স্ট্রিংটি ফিরিয়ে দেওয়া উচিত। বিকাশকারী.অ্যান্ড্রয়েড .com/references/android/widget/…, android.view.KeyEvent)
অ্যান্ড্রু ম্যাকেনজি

+1 রিয়েল একটি দুর্দান্ত উত্তর। ক্যারেক্টার.আইসলেটারঅরডিজিট () এই সমস্ত পদ্ধতি খুব দরকারী।
অতুল ভরদ্বাজ

@ অ্যান্ড্রুম্যাকেনজি যদি ইনপুট চরিত্র, উদাহরণস্বরূপ, একটি কমা- ',', যা আইনী নয়, এবং আমি এটি অপসারণ করতে চাই, উপরের কোডটি কীভাবে স্থির করা যায়।
twlkyao

! ক্যারেক্টার.আইসলেটারঅরডিজিট (উত্স.সিআরএট (আই)) &&! ক্যারেক্টার.আইসস্পেসচার (সোর্স.সিএআরএটি (আই)) স্পেসের জন্য অনুমতি দেবে
লিওন

139

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

2
আপনি উত্সটি অনুচ্ছেদ করতে চান না কেন এমন কোনও কারণ আছে? আপনি কেবল এটি করে কিছু ভুল দেখছেন (কেবলমাত্র বর্ণানুক্রমিক এবং কয়েকটি বিশেষ চরিত্রের অনুমতি দেওয়ার জন্য): String replacement = source.subSequence(start, end).toString(); return replacement.replaceAll("[^A-Za-z0-9_\\-@]", "");
স্প্ল্যাশ

3
অভিধানের পুনরাবৃত্তি প্রস্তাব পাঠ্যটি প্রদর্শিত হবে এমন কোনও বিষয় এটি বিবেচনায় নেবে না। @ সার্উস তাদের উত্তরে তা সনাক্ত করেছে। মূলত আপনার উভয় ক্ষেত্রেই কোনও পরিবর্তন না করা হলে আপনার শূন্য হওয়া উচিত।
hooby3dfx

3
এই কোডটি lukasz হিসাবে সঠিক হিসাবে কাজ করেছে (উপরের উত্তরে) তবে আমি অ-অভিধানের শব্দের সাথে কিছু সমস্যার সম্মুখীন হচ্ছি। আমি যখন চিরু টাইপ করি তখন এটি চিরুচিরুচিরুর মতো 3 বার দেখায়। কীভাবে সমাধান করবেন? এবং এটিতে সাদা স্পেসগুলিও লাগে তবে কীভাবে পরের সাদা স্পেসগুলির সাথে সীমাবদ্ধ রাখবেন?
চিরু

3
কিছু কারণে জন্য যখন source instanceof SpannableStringBuilder, লিখে এবি আমাকে দেয় অ্যাবের যখন পূর্ববর্তী উত্তর চেষ্টা। ভাগ্যক্রমে নীচে @ ফ্লোরিয়ান সমাধান ব্যবহার করে আমি এটির আশপাশে কাজ করতে সক্ষম হয়েছি।
গিলিয়াম

1
@ hooby3dfx একেবারে ঠিক। যদিও এটি শেষ পর্যন্ত স্ট্রিংটি সঠিকভাবে পরিচালনা করতে সক্ষম হয়, আপনি অভিধান / শব্দ সমাপ্তিটি ব্যবহার করার সময় তা বিভ্রান্ত হয়।
অরবিন্দ

107

আরো সহজ:

<EditText
    android:inputType="text"
    android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm" />

9
যদিও এটি একটি সঠিক উত্তরের মতো বলে মনে হচ্ছে ডক্স অনুসারে একটি সমস্যা রয়েছে: "কীলিস্টেনারের সমস্ত বাস্তবায়ন হিসাবে, এই শ্রেণিটি কেবল হার্ডওয়্যার কীবোর্ডগুলির সাথে সম্পর্কিত Software সফ্টওয়্যার ইনপুট পদ্ধতিগুলির এই শ্রেণীর পদ্ধতিগুলি ট্রিগার করার কোনও বাধ্যবাধকতা নেই" " আমি মনে করি একটি ইনপুটফিল্টার সম্ভবত আরও বেশি জটিল, তবুও আরও জটিল।
ক্রেগ বি

19
দুর্দান্ত সমাধান স্রেফ যুক্ত করতে চান আপনার ","মাঝে মধ্যে দেওয়ার দরকার নেই । আপনি এর মতো কিছু ব্যবহার করতে পারেন"0123456789qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM"
ডেল্টাপ্যাপ ০১৯

26
একটি বহুভাষিক সমাধান নয়
অ্যাভারিন

আপনি যদি আপনার অ্যাপ্লিকেশন অনুবাদ অনুবাদ করতে চান। এই সমাধান ব্যবহার করবেন না!
গ্রান্টেস্পো

দেখে মনে হচ্ছে এটি এর মতো কাজ করে না imeOptions="actionNext"etc. ইত্যাদি
পিট ডয়েল

68

পোস্ট করা উত্তরগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি। আমি আমার নিজস্ব সমাধান নিয়ে এসেছি:

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 });

3
অভিধানের প্রস্তাবনা থেকে পাঠ্য পুনরাবৃত্তি রোধ করার পক্ষে এটিই সঠিক উত্তর! ভোট দিন!
hooby3dfx

4
একমাত্র জিনিস, EditTextইতিমধ্যে নিজস্ব ফিল্টার থাকতে পারে, যেমন দৈর্ঘ্য ফিল্টার। সুতরাং কেবলমাত্র ফিল্টারগুলি ওভাররাইড করার পরিবর্তে আপনি সম্ভবত ইতিমধ্যে বিদ্যমান ফিল্টারগুলিতে আপনার ফিল্টারগুলি যুক্ত করতে চান।
আলেক্স এন।

এটি কি এখনও আপ টু ডেট? আমার জন্য অ্যান্ড্রয়েড 6.0.1 এটি অনস্ক্রিন কীবোর্ডে কাজ করে
XxGoliathusxX

2
এই উত্তরের একটি সামান্য সমস্যা (বা অ্যান্ড্রয়েডের ইনপুট প্রক্রিয়াটি কীভাবে কাজ করে তা নিয়ে) ব্যাকস্পেসটি মাঝে মাঝে ব্যবহারকারীর কাছে কাজ না করার জন্য উপস্থিত হয় কারণ তারা পূর্বে প্রবেশ করা অবৈধ অক্ষরগুলির পিছনে ব্যাকস্পেস করছে যা এখনও সোর্স বাফারে রাখা আছে।
jk7

1
Asukasz Sromek এর সমাধান হিসাবে একই সমস্যা: একটি স্থান অনুসরণ করে একটি অবৈধ অক্ষর একটি স্থান দ্বারা প্রতিস্থাপিত হয়।
ইনগো শ্যাচাল-শাপ্প

25

এটি আপনার প্রয়োজন এবং এটি খুব সহজ 100% এর কাজটি ব্যবহার করুন।

<EditText
android:inputType="textFilter"
android:digits="@string/myAlphaNumeric" />

স্ট্রিং.এক্সএমএল এ

<string name="myAlphaNumeric">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</string>

15

ইনপুট টাইপ বিশেষ অক্ষর এড়াতে

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 });

@ সত্য্যা আপনি ডব্লিউসি, আপনাকে সাহায্য করে খুশি :)

1
এই অক্ষরগুলির কোনওটিকেই ব্লক করে না। ㋛ ㋛ ☺ ☹ ☻ 〠 シ ッ ツ ヅ Ü 〲 〴 ﭢ ﭢ ⍡ ⍡ ⍣ ⍣ ⍤ ⍨ ⍨ ⍩ ὕ ὣ ὣ Ѷ
অ্যানারোকোফ্যাসিস্ট

7

গৃহীত উত্তরের পাশাপাশি, এটি ব্যবহার করা সম্ভব যেমন: কেবলমাত্র বড় হাতের অক্ষর (এবং সংখ্যা) গ্রহণ করার জন্য android:inputType="textCapCharacters"একটি গুণ হিসাবে <EditText>


5
অ্যান্ড্রয়েড: ইনপুটটাইপ = "টেক্সটক্যাপচার্যাক্টস" ',, "ইত্যাদির মতো অন্যান্য অক্ষরের ব্যবহারের মধ্যে সীমাবদ্ধ করে না
টিভিডি

এটি ইনপুট পদ্ধতিতে কেবল একটি ইঙ্গিত। এটি কোন অক্ষরগুলিকে ইনপুট হওয়ার অনুমতি দেয় তা সীমাবদ্ধ করে না।
ডিসকো

5

কোনও কারণে অ্যান্ড্রয়েড.টেক্সট.লগিনফিল্টার শ্রেণীর নির্মাতা প্যাকেজ-স্কোপড, তাই আপনি সরাসরি এটি প্রসারিত করতে পারবেন না (যদিও এটি এই কোডটির সাথে সমান হবে)। তবে আপনি লগইনফিল্টারটি বাড়িয়ে দিতে পারেন 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;
    }
}

এটি আসলে নথিভুক্ত নয়, তবে এটি মূল স্বচ্ছল অংশ, এবং উত্সটি সোজা । আমি এটি কিছুক্ষণের জন্য ব্যবহার করছি, এখনও পর্যন্ত কোনও সমস্যা নেই, যদিও আমি স্বীকার করি যে আমি স্প্যানিয়েবলগুলি জড়িত কোনও জটিল করার চেষ্টা করি নি।


5

এটি ঠিক, এক্সএমএল লেআউটটিতে এটি ব্যবহার করে এটি ঠিক করার সেরা উপায় way

<EditText
android:inputType="text"
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" />

ঠিক যেমনটি ফ্লোরিয়ান ফ্রেহলিচ নির্দেশ করেছেন, এটি পাঠ্য দর্শনের জন্যও ভাল কাজ করে।

<TextView
android:inputType="text"
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" />

কেবলমাত্র সাবধানতার একটি শব্দ, উইলের বর্ণিত অক্ষরগুলি android:digitsকেবল প্রদর্শিত হবে, সুতরাং কোনও অক্ষর সেট না মিস করার জন্য কেবল সতর্কতা অবলম্বন করুন :)


আপনার ইনপুট টাইপ = "টেক্সটফিল্টার" সংজ্ঞায়িত করতে হবে তবেই এটি সঠিকভাবে কাজ করবে।
শ্রেয়াশ মহাজন

@ শ্রীরাশ মহাজন, এটি কি ডিভাইস / কীবোর্ড অ্যাপের উপর নির্ভর করে? আমার ক্ষেত্রে inputTypeফিল্টারিং প্রভাবিত করে না।
কুলমাইন্ড

4

এই সহজ সমাধানটি আমার পক্ষে কাজ করেছিল যখন আমি কোনও সম্পাদনা পাঠ্যে খালি স্ট্রিংগুলিতে প্রবেশ করা থেকে ব্যবহারকারীদের আটকাতে পারি। আপনি অবশ্যই আরও অক্ষর যুক্ত করতে পারেন:

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});

}

কিভাবে এই সমাধান কল?
জিক্স

1

আপনি যদি ইনপুটফিল্টার সাবক্লাস করেন তবে আপনি নিজের ইনপুটফিল্টার তৈরি করতে পারেন যা কোনও অ-আলফা-সংখ্যাসূচক অক্ষরগুলিকে ফিল্টার করতে পারে।

ইনপুটফিল্টার ইন্টারফেসের একটি পদ্ধতি রয়েছে 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)


1

অভিধানের পরামর্শগুলিকে সঠিকভাবে পরিচালনা করতে, অন্যান্য লোকেরা যে স্প্যান স্টাফগুলিকে মোকাবেলা করেছে তা উপেক্ষা করে আমি নিম্নলিখিত কোডের কাজটি পেয়েছি।

প্রস্তাবটি বাড়ার সাথে সাথে উত্সটি বৃদ্ধি পেয়েছে তাই আমাদের কিছু প্রত্যাবর্তনের আগে এটি কতটা অক্ষর বাস্তবে আমাদের প্রতিস্থাপনের প্রত্যাশা করে তা দেখতে হবে।

আমাদের যদি কোনও অবৈধ অক্ষর না থাকে তবে নালটি ফিরুন যাতে ডিফল্ট প্রতিস্থাপন ঘটে।

অন্যথায় আমাদের স্ট্রিং থেকে বৈধ অক্ষরগুলি বের করতে হবে যা প্রকৃতপক্ষে সম্পাদনা পাঠ্য স্থানে স্থাপন করা হবে।

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;
    } 
}; 

1

এডিটেক্সটে শব্দ রোধ করতে। আপনি যে কোনও সময় ব্যবহার করতে পারেন এমন একটি শ্রেণি তৈরি করুন।

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;
    }
}

1

প্রথমে এতে যুক্ত করুন 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


1

এটি একটি পুরানো থ্রেড, তবে উদ্দেশ্যযুক্ত সমাধানগুলিতে সমস্ত সমস্যা রয়েছে (ডিভাইস / অ্যান্ড্রয়েড সংস্করণ / কিবোর্ডের উপর নির্ভর করে)।

বিবিধ পদ্ধতি

তাই অবশেষে আমি এর পরিবর্তে ব্যবহার করার, একটি ভিন্ন পদ্ধতির সঙ্গে গিয়েছিলাম 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তা সামনে।
অ্যান্ডি

মন্তব্যের জন্য ধন্যবাদ. সংশোধন করা হয়েছে।
ইয়াল বীরাণ

1

এটিকে সহজ রাখতে আমি এরকম কিছু করেছি:

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


1
ধন্যবাদ! টাইপ করার পাশাপাশি কোনও পাঠ্য আটকানোর সময় এই সমাধানটি ভাল কাজ করে।
কুলমাইন্ড

0

এটি ব্যবহার করা সম্ভব setOnKeyListener। এই পদ্ধতিতে, আমরা ইনপুট কাস্টমাইজ করতে পারি edittext!


0

এইভাবে আমি সম্পাদনা পাঠ্যে নাম ক্ষেত্রের জন্য ফিল্টার তৈরি করেছি ((প্রথম বর্ণটি সিএপিএস 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)});
}

কনস্ট্যান্টস.ডিলিমিটার.ব্ল্যাঙ্ক অজানা।
কুলমাইন্ড

0

কোটলিনে আমারও একই উত্তর:

/**
 * 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))
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.