2012-10-09 9 views
18

में onTextChanged के निष्पादन से बच सकते हैं मैं बच सकते हैं कैसे है कि एक कोड लाइन की तरह:मैं कैसे Android के EditText

((EditText) findViewById(R.id.MyEditText)).setText("Hello"); 

यहाँ एक घटना का कारण होगा:

((EditText) findViewById(R.id.MyEditText)).addTextChangedListener(new TextWatcher() { 
@Override 
public void onTextChanged(CharSequence s, int start, 
    int before, int count) { 
// HERE 
} 

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

@Override 
public void afterTextChanged(Editable s) { 
} 
}); 

मैं जानना चाहता हूँ अगर वहाँ AutoCompleteTextView के ड्रॉपडाउन परिणाम को चुनने के मामले में मैंने देखा कि टेक्स्ट के निष्पादन को बाधित करने का कोई भी तरीका (कोई भी टेक्स्ट चेंज निष्पादित नहीं किया गया है!)।

मैं की तरह "अगर हैलो कुछ भी नहीं" समाधान के लिए मांग नहीं कर रहा हूँ ...

+11

टेक्स्ट सेट करना उस श्रोता को ट्रिगर करेगा। एक आसान तरीका 'टेक्स्टवॉचर' का संदर्भ रखना है, पाठ को सेट करने से पहले श्रोता को हटाएं ('हटाएं टेक्स्ट चेंज लिस्टर (वॉचर)' के साथ), टेक्स्ट सेट करें, श्रोता को सक्षम करें ('addTextChangedListener (watcher) 'के साथ)। यदि आप इसे कुछ बार से अधिक करते हैं तो आप इसे सुविधा के लिए एक विधि में प्राप्त कर सकते हैं। – Luksprog

+0

संभव डुप्लिकेट [एंड्रॉइड: मैं टेक्स्ट वॉचर को ट्रिगर किए बिना संपादन टेक्स्ट टेक्स्ट कैसे बदल सकता हूं?] (Http://stackoverflow.com/questions/9385081/android-how-can-i-change-the- edittext-text-without-triggering-the-text-watcher) – danpetruk

+0

श्रोता के साथ चेकबॉक्स पर अपडेट के लिए हल किए गए एक ही प्रश्न का उदाहरण http://stackoverflow.com/a/15523518/2162226 – gnB

उत्तर

22

स्रोत AutoCompleteTextView के लिए वे पाठ खंड पूरा होने

  mBlockCompletion = true; 
     replaceText(convertSelectionToString(selectedItem)); 
     mBlockCompletion = false;  
किसी भी रूप में

इस रूप में अच्छा एक तरीका है द्वारा प्रतिस्थापित किया जा रहा है प्राप्त करने के लिए आप क्या करना चाहते हैं कहने के लिए एक बूलियन सेट है कि पता चलता है। TextWatcher तो देखने के लिए जाँच करता है, तो setText और विधि

void doBeforeTextChanged() { 
    if (mBlockCompletion) return; 

जोड़ना और हटाना TextWatcher आवेदन

1

मुझे नहीं लगता कि वहाँ श्रोता को निष्क्रिय करने के लिए एक आसान तरीका है, लेकिन आप इसे चारों ओर से या तो प्राप्त कर सकते हैं:

  • टेक्स्ट सेट करने से पहले TextWatcher को हटाने और इसे बाद में जोड़ने से पहले।
  • या पाठ सेट करने से पहले boolean ध्वज सेट करें, जो इसे अनदेखा करने के लिए TextWatcher बताता है।

उदा।

boolean ignoreNextTextChange = true; 
((EditText) findViewById(R.id.MyEditText)).setText("Hello"); 

और अपनी TextWatcher:

new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     /* 
     If the flag is set to ignore the next text change, 
     reset the flag, and return without doing anything. 
     */ 
     if (ignoreNextTextChange){ 
      ignoreNextTextChange = false; 
      return; 
     } 
    } 

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

    } 

    @Override 
    public void afterTextChanged(Editable s) { 

    } 
}); 

यह थोड़ा hacky है, लेकिन यह काम करना चाहिए :)

+0

वहां वापस लौटने से पहले टेक्स्ट के बाद और बाद में निष्पादन को रोक दिया जाएगा भी बदल गया, या आपको वहां एक और बूलियन जांच की आवश्यकता होगी? – Menasheh

0

केवल दो तरीके मैं देख सकता हूँ

  • आप के भीतर जाँच श्रोता
  • आप श्रोता के अनुसार श्रोता को जोड़/हटाते हैं टाइन की स्थिति

पहला तरीका आपके लिए एक अवांछित कामकाज है, मुझे डर है कि आप दूसरे तरीके से काम करते हैं।

1

एक वैकल्पिक तरीका करने के लिए लेने के लिए अधिक समय हो जाएगा से बाहर रिटर्न एक पूरा होने के माध्यम से आ गया है इसे प्राप्त करने के लिए setOnKeyListener का उपयोग करना होगा।

यह तब तभी ट्रिगर होगा जब उपयोगकर्ता उपयोगकर्ता द्वारा प्रोग्रामेटिक रूप से एडिटटेक्स्ट बदल जाता है, बल्कि जब कोई कुंजी दबाता है।

myEditText.setOnKeyListener(new EditText.OnKeyListener() { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     switch(event.getAction()) { 
      case KeyEvent.ACTION_DOWN: 
       // beforeTextChanged 
       break;  
      case KeyEvent.ACTION_UP: 
       // afterTextChanged 
       break; 
     } 
     return false; 
    } 
}); 
5

मैं एक ही समस्या पर stumpled। मैंने यह पता लगाने के लिए पता लगाया कि किस दृश्य में वर्तमान में उपयोगकर्ता और प्रोग्राम ट्रिगर किए गए ईवेंट के बीच अंतर करने के लिए फ़ोकस है।

EditText myEditText = ((EditText) findViewById(R.id.myEditText)); 

myEditText.addTextChangedListener(new TextWatcher() 
{ 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) 
    { 
     if(getCurrentFocus() == myEditText) 
     { 
      // is only executed if the EditText was directly changed by the user 
     } 
    } 

    //... 
}); 
0

वैकल्पिक रूप से आप बस mEditText.hasFocus() उपयोग कर सकते हैं पाठ के बीच अंतर करना है कि मानव-बदल गया है या कार्यक्रम-बदल गया है, यह मेरे लिए ठीक काम करता है:

@Override 
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
    if (mEditText.hasFocus()) { 
     // Do whatever 
    } 
} 

आशा इस मदद करता है!