অ্যান্ড্রয়েড এডিটেক্সট অনচেঞ্জ শ্রোতা


114

আমি তার সম্পর্কে কিছুটা জানি TextWatcherতবে এটি আপনার প্রবেশ করা প্রতিটি চরিত্রের উপরে আগুন ধরে। আমি এমন একটি শ্রোতা চাই যা ব্যবহারকারী যখনই সম্পাদনা শেষ করে fire এটা কি সম্ভব? এছাড়াও TextWatcherআমি একটি উদাহরণ Editableপাই তবে আমার একটি উদাহরণ প্রয়োজন EditText। আমি কীভাবে এটি পেতে পারি?

সম্পাদনা : দ্বিতীয় প্রশ্নটি আরও গুরুত্বপূর্ণ। দয়া করে এর উত্তর দিন।


1
ফোকাস শ্রোতাদের যুক্ত করার চেষ্টা করুন, যখন সম্পাদনা পাঠ্য ফোকাসটি গ্রহণ করবেন, তার মানে ব্যবহারকারী এটি সম্পাদনা শুরু করেছেন এবং যখন সম্পাদনাটেক্সট ফোকাসটি হারাবেন, তার অর্থ সম্পাদনাটি শেষ হয়েছে
হিউসাইন

উত্তর:


213

প্রথমে, আপনি দেখতে পাচ্ছেন যে ব্যবহারকারী যদি EditTextফোকাসটি হারায় বা পাঠক সম্পাদনা শেষ করেছেন বা যদি ব্যবহারকারী সম্পন্ন বোতামটি টিপায় (এটি আপনার বাস্তবায়নের উপর নির্ভর করে এবং আপনার পক্ষে সবচেয়ে ভাল কিসের উপর নির্ভর করে)। দ্বিতীয়ত, আপনি যদি উদাহরণস্বরূপ বস্তু হিসাবে ঘোষণা করে থাকেন তবে আপনি কেবলমাত্র EditTextএকটির মধ্যে উদাহরণ পেতে পারবেন না । যদিও এটি নিরাপদ নয় বলে আপনার মধ্যে সম্পাদনা করা উচিত নয় ।TextWatcherEditTextEditTextTextWatcher

সম্পাদনা করুন:

EditTextআপনার TextWatcherপ্রয়োগে উদাহরণটি পেতে সক্ষম হতে আপনার এই জাতীয় কিছু চেষ্টা করা উচিত:

public class YourClass extends Activity {

    private EditText yourEditText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        yourEditText = (EditText) findViewById(R.id.yourEditTextId);

        yourEditText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                // you can call or do what you want with your EditText here

                // yourEditText... 
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            public void onTextChanged(CharSequence s, int start, int before, int count) {}
        });
    }
}

নোট করুন যে উপরের নমুনায় কিছু ত্রুটি থাকতে পারে তবে আমি আপনাকে কেবল একটি উদাহরণ দেখাতে চেয়েছিলাম।


17

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

public abstract class TextChangedListener<T> implements TextWatcher {
    private T target;

    public TextChangedListener(T target) {
        this.target = target;
    }

    @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) {
        this.onTextChanged(target, s);
    }

    public abstract void onTextChanged(T target, Editable s);
}

এখন শ্রোতার বাস্তবায়ন কিছুটা পরিষ্কার is

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

যতক্ষণ এটি জ্বলতে থাকে, কোনও সম্ভবত //Do stuffএকটি প্রদত্ত একটি এর পরে তাদের পছন্দসই কোডটি চালানোর জন্য একটি চেক প্রয়োগ করতে পারে


এটি আমার পক্ষে খুব ভাল কাজ করে, প্রচুর কোড লাইন সাশ্রয় করে! তুমি প্রতিভাবান!
হুইপ্যাম 99

12

যে কেউ বাটারনিফ ব্যবহার করছে । আপনি এর মতো ব্যবহার করতে পারেন:

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}

6

আমি এটি ব্যবহার করে সম্পন্ন করেছি AutotextView:

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        seq = cs;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        new SearchTask().execute(seq.toString().trim());
    }

});

3
 myTextBox.addTextChangedListener(new TextWatcher() {  

    public void afterTextChanged(Editable s) {}  

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

    public void onTextChanged(CharSequence s, int start, int before, int count) {  

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);  
    myOutputBox.setText(s);  

    }  
});  

2
শেষে একটি অপ্রয়োজনীয় আছে
হাওয়ার্ড

2

TextWatcherএটি আমার পক্ষে কাজ করে নি কারণ এটি প্রত্যেকের জন্য গুলি চালিয়ে যায় EditTextএবং একে অপরের মূল্যবোধকে জড়িয়ে দেয়।

এখানে আমার সমাধান:

public class ConsultantTSView extends Activity {
    .....

    //Submit is called when I push submit button.
    //I wanted to retrieve all EditText(tsHours) values in my HoursList

    public void submit(View view){

        ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
        String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
    }
}

সুতরাং getChildAt(xx)পদ্ধতিটি ব্যবহার করে আপনি যে কোনও আইটেম পুনরুদ্ধার করতে পারেন ListViewএবং পৃথক আইটেমটি ব্যবহার করে পেতে পারেন findViewById। এবং এটি তখন সবচেয়ে সাম্প্রতিক মান দেবে।


1

আমি যতদূর মনে করতে পারি এটিকে কেবলমাত্র দুটি উপায় আপনি এটি করতে পারেন। আপনি কীভাবে জানতে পারবেন যে ব্যবহারকারী কোনও শব্দ লেখার কাজ শেষ করেছেন? হয় ফোকাস হারিয়েছে, বা "ওকে" বোতামে ক্লিক করুন। আমার মনে কোনও উপায় নেই আপনি বুঝতে পারবেন ব্যবহারকারীটি শেষ চরিত্রটি টিপেছে ...

সুতরাং কল onFocusChange(View v, boolean hasFocus)বা একটি বোতাম এবং এটিতে একটি শ্রোতা ক্লিক করুন।


0

ওয়াচচার পদ্ধতিটি প্রতিটি অক্ষরের ইনপুটগুলিতে আগুন দেয়। সুতরাং, আমি ফোকাস চেঞ্জ পদ্ধতির ভিত্তিতে এই কোডটি তৈরি করেছি:

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

এটি ব্যবহার করতে, কেবল এই জাতীয় কল করুন:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

আপনি! Coms (dat.s, "+ + EdTe.getText ()) এর সাথে সমান ফাংশনটি প্রতিস্থাপন করে coms ফাংশনটিকে উপেক্ষা করতে পারেন। তবে সমান ফাংশন নিজেই কিছু সময় রান টাইমে সঠিকভাবে কাজ করে না।

অন ​​চেঞ্জ শ্রোতা ব্যবহারকারীদের ফোকাস টাইপ করার সময় সম্পাদনা পাঠের পুরানো ডেটা মনে রাখবে এবং তারপরে ব্যবহারকারী ফোকাস হারাতে বা অন্য ইনপুটটিতে ঝাঁপিয়ে পড়লে নতুন ডেটার তুলনা করে। যদি পুরনো স্ট্রিংয়ের সাথে নতুন নতুন স্ট্রিং না তুলনা করা হয় তবে এটি কাজটিকে আগুন ধরিয়ে দেয়।

আপনার যদি কেবল 1 এডিটেক্সট থাকে তবে আপনার উইন্ডোজগুলির বাইরে Ul একটি আলটিমেট সিক্রেট ট্রান্সপারেন্ট মাইক্রো এডিটেক্সট তৈরি করে একটি ক্লিয়ারফোকাস ফাংশন তৈরি করতে হবে এবং এতে ফোকাসের অনুরোধ করতে হবে, তারপরে আমদানি পদ্ধতি পরিচালকের মাধ্যমে কীবোর্ডটি আড়াল করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.