2011-03-01 12 views
5

जोड़ने से पहले टेक्स्ट सेट किया है, फिर भी, मैं पहले टेक्स्ट को एडिटटेक्स्ट में पुनर्प्राप्त करता हूं और उसके बाद टेक्स्टवैचर जोड़ता हूं।टेक्स्टवॉचर ने एंड्रॉइड गतिविधि में वॉचर

private static int WC = 0; 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
Log.e("TextWatcherTest", "onCreate:\t" +CLASS_NAME); 
setContentView(R.layout.main); 

EditText et = (EditText)findViewById(R.id.editText); 
Log.e("TextWatcherTest", "Set text xyz"); 
et.setText("xyz"); 

et.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { } 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 
    @Override 
    public void afterTextChanged(Editable s) { 
     Log.e("TextWatcherTest", "afterTextChanged:\t" +s.toString()); 
    } 
}); 
} 

लेकिन जब मैं गतिविधि चलाने के लिए, afterTextChanged विधि भले ही चौकीदार ही पाठ सेट करने के बाद जोड़ा जाता है कहा जाता है। इसलिए लॉग उत्पादन की तरह

 
onCreate: LifecycleMain 
Set text xyz 
// screen rotation 
onCreate: LifecycleMain 
Set text xyz 
afterTextChanged: xyz 2 

कुछ TextWatcher में काउंटर से पता चलता है कि द्रष्टा कि कहा जाता है कि एक के बाद पाठ EditText में स्थापित किया गया था जोड़ा गया है है। कोई विचार क्यों होता है और मैं इसे कैसे रोक सकता हूं?

उत्तर

1

यह निश्चित रूप से हो रहा है। सहेजे गए इंस्टेंस में जब आप पाठ सेट कर रहे हैं तो स्थिति शून्य नहीं है (जिसका अर्थ है कि आपके पिछले ऑब्जेक्ट स्टेटस सहेजे गए हैं)।

मुझे लगता है कि ऐसा इसलिए होता है क्योंकि आपने टेक्स्टटैचर को अपने संपादन टेक्स्ट में ऑनक्रेट विधि में जोड़ा है, और अगली बार क्रेट को कॉल किया जाता है (उदा। कॉन्फ़िगरेशन परिवर्तन के बाद) तो यह पता चलता है कि टेक्स्टवॉचर पहले से ही संपादन टेक्स्ट में जोड़ा गया है।

आप इस स्थिति के लिए जाँच करने के लिए चाहते हैं, तो अपनी हालत से पहले इस डाल:

if(savedInstanceState == null){ 
    Log.e("savedInstance state is null", "no text"); 
    et.setText("No text"); 
} 

इस मामले में, अगर आप अपने EditText पर setText कहते हैं, तो afterTextChanged (संपादन योग्य रों) कहा जाता है नहीं किया जाएगा।

+0

वास्तव में नहीं। यह वास्तव में सच है कि यह पहली बार गतिविधि बनने पर काम करता है, लेकिन एडिटटेक्स्ट हर बार एक नया उदाहरण है जब बिना किसी वॉचर से जुड़ा होता है। मैंने कोड को सरल बना दिया और वॉचर को काउंटर जोड़ा: – SimonSays

+0

क्या आपने संपादन टेक्स्ट को स्थिर के रूप में परिभाषित किया है? यदि हां यह कारण हो सकता है। और जैसा कि आप उल्लेख करते हैं कि यह पहली बार f9 काम करता है, तो जांच निश्चित रूप से है कि ediText का नया उदाहरण प्रत्येक बार –

+0

क्षमा नहीं किया जा रहा है, मैंने इसे समाप्त करने से पहले अपनी टिप्पणी अपडेट की है। मैंने अभी उपरोक्त कोड अपडेट किया है। मैंने इसे सरल बना दिया और टेक्स्टवॉचर के लिए एक काउंटर जोड़ा। आप क्या देख सकते हैं कि गतिविधि पहली बार गतिविधि बनने पर पहली बार दिखाई नहीं दे रही है, लेकिन दूसरी बार। लेकिन, दूसरा टेक्स्टवॉचर उदाहरण कहा जाता है, पहले नहीं। एडिटटेक्स्ट हमेशा किसी भी वॉचर संलग्न किए बिना एक नया उदाहरण है। और नहीं; EditText स्थिर परिभाषित नहीं है। – SimonSays

7

समाधान आपके addTextChangedListener कोPostCreate विधि पर ले जाना है। सब हल हो जाएगा।

+0

मेरे लिए "isResumed()" जांचने के लिए सुविधाजनक (एक टुकड़े टुकड़े में) था और इस मामले में केवल टेक्स्ट पर प्रतिक्रिया का जवाब दिया गया था, यह चाल चल रहा था – hmac

+0

मेरे लिए काम नहीं किया –

संबंधित मुद्दे