android edittext ऑनकेंज श्रोता


115

मुझे इसके बारे में थोड़ा-बहुत पता है TextWatcherलेकिन आपके द्वारा दर्ज किए गए हर चरित्र पर आग लग जाती है। मैं एक श्रोता चाहता हूं जो उपयोगकर्ता द्वारा संपादन समाप्त करने पर आग लगा दे। क्या यह संभव है? में भी TextWatcherमुझे एक उदाहरण मिलता है, Editableलेकिन मुझे एक उदाहरण की आवश्यकता है EditText। मुझे वह कैसे मिलेगा?

EDIT : दूसरा प्रश्न अधिक महत्वपूर्ण है। कृपया इसका उत्तर दें।


1
फोकस श्रोता को जोड़ने की कोशिश करें, जब editText ध्यान केंद्रित करता है, इसका मतलब है कि उपयोगकर्ता ने इसे संपादित करना शुरू कर दिया है, और जब
editText

जवाबों:


214

सबसे पहले, आप देख सकते हैं कि यदि उपयोगकर्ता EditTextफ़ोकस खो देता है या यदि उपयोगकर्ता किए गए बटन को दबाता है (तो यह आपके कार्यान्वयन पर निर्भर करता है और आपके लिए सबसे अच्छा क्या है) पाठ को संपादित करते हुए । दूसरा, आपको केवल तभी EditTextउदाहरण नहीं मिल सकता है TextWatcherजब आपने EditTextएक उदाहरण ऑब्जेक्ट के रूप में घोषित किया हो । हालांकि आप इसे सुरक्षित नहीं है क्योंकि EditTextभीतर संपादित नहीं करना चाहिए TextWatcher

संपादित करें:

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

यह मुझे परेशान कर रहा था कि मेरे सभी EditText क्षेत्रों के लिए एक श्रोता को लागू करने के लिए मुझे बदसूरत, क्रिया कोड की आवश्यकता थी इसलिए मैंने नीचे का वर्ग लिखा। इस पर ठोकर खाने वाले किसी के लिए भी उपयोगी हो सकता है।

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

अब श्रोता को लागू करना थोड़ा साफ है।

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

कितनी बार यह आग लगाता है, एक के //Do stuffबाद एक अपने वांछित कोड को चलाने के लिए एक चेक लागू कर सकता है


यह मेरे लिए बहुत अच्छी तरह से काम करता है, कोड लाइनों का एक बहुत बचाता है! तुम अकल्मन्द हो!
huypham99

12

ButterKnife का उपयोग करने वाला कोई भी व्यक्ति । आप इस तरह का उपयोग कर सकते हैं:

@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

प्रत्येक वर्ण इनपुट पर वॉचर विधि आग लगाती है। इसलिए, मैंने इस कोड को onFocusChange विधि पर आधारित बनाया:

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 फ़ंक्शन को। Com (dat.s, "" + EdTe.getText ()) के स्थान पर समान फ़ंक्शन से अनदेखा कर सकते हैं। हालाँकि समान कार्य कुछ समय में ही सही समय पर सही ढंग से काम नहीं करता है।

जब उपयोगकर्ता टाइपिंग पर ध्यान केंद्रित करता है, तब उपयोगकर्ता को फोकस खो जाने या अन्य इनपुट पर जाने पर नए डेटा की तुलना करें। यदि पुराने स्ट्रिंग की तुलना एक ही नए स्ट्रिंग से नहीं की जाती है, तो यह कार्य को फायर करता है।

यदि आपके पास केवल 1 EditText है, तो u को विंडो के बाहर एक अल्टीमेट सीक्रेट ट्रांसपेरेंट माइक्रो EditText Edit बनाकर ClearFocus फंक्शन करना होगा और फ़ोकस करने का अनुरोध करना होगा, फिर कीबोर्ड को इम्पोर्ट मेथड मैनेजर के माध्यम से छिपाएँ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.