2012-06-21 20 views
79

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

संपादित: दूसरा सवाल ज्यादा महत्वपूर्ण है। कृपया इसका उत्तर दें।

+1

फोकस श्रोता जोड़ने की कोशिश के बाद //Do stuff में उनकी इच्छा के कोड को चलाने के लिए एक चेक, को लागू कर सकता है जब editText फ़ोकस लेना , इसका मतलब है कि उपयोगकर्ता ने इसे संपादित करना शुरू कर दिया है, और जब संपादन टेक्स्ट फोकस खो देता है, तो इसका मतलब है कि संपादन समाप्त हो गया है – Houcine

+0

https://github.com/henrychuangtw/AutoInsertEditText – HenryChuang

उत्तर

156

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

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

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

} 

ध्यान दें कि ऊपर नमूना कुछ त्रुटियाँ हो सकता है लेकिन मैं सिर्फ चाहता था:

आप कुछ इस तरह का प्रयास करना चाहिए अपने TextWatcher कार्यान्वयन में EditText उदाहरण प्राप्त करने में सक्षम होना करने के लिए आपको एक उदाहरण दिखाओ

1

जहां तक ​​मैं इसे सोच सकता हूं, वहां केवल दो तरीके हैं जो आप कर सकते हैं। आप कैसे जान सकते हैं कि उपयोगकर्ता ने एक शब्द लिखना समाप्त कर दिया है? या तो फोकस पर खो गया है, या "ठीक" बटन पर क्लिक करना। मेरे दिमाग पर कोई रास्ता नहीं है आप उपयोगकर्ता को अंतिम चरित्र दबा सकते हैं ...

तो onFocusChange(View v, boolean hasFocus) पर कॉल करें या इसमें एक बटन और एक क्लिक श्रोता जोड़ें।

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 का उपयोग कर अलग-अलग आइटम प्राप्त कर सकते हैं:

यहाँ मेरी समाधान है। और फिर यह सबसे हालिया मूल्य देगा।

4

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

}); 
8

ButterKnife का उपयोग कर किसी को भी।

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

} 
7

यह मुझे परेशान कर रहा था कि मेरी 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 
      } 
     }); 

ऐसा कितनी बार आग के रूप में, एक हो सकता है किसी दिए गए एक

2
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

अंत में एक अनावश्यक} है – Howard