2010-09-12 17 views
20

मैंने एक संपादन टेक्स्ट-फ़ील्ड को परिभाषित किया है और जब उपयोगकर्ता उस फ़ील्ड को संपादित करता है तो मैं सूचित होना चाहता हूं। तो मैंने सोचा: सरल - मैं एक ऑनके लिस्टनर जोड़ता हूं और इसलिए मैंने किया। लेकिन भले ही टेक्स्ट फ़ील्ड संपादित हो जाए (और यहां तक ​​कि दर्ज/संशोधित पाठ भी प्रदर्शित करता है) मुझे कोई कॉलबैक नहीं मिलता है, यानी LOG-output दिखाई नहीं देता है।एंड्रॉइड: मेरा ऑनकी लिस्टनर() क्यों नहीं कहा जाता है?

TextView text = new TextView(this); 
    text.setText(...); 
    ... 
    text.setOnKeyListener(new OnKeyListener() 
    {       
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      TextView tv = (TextView)v; 
      CharSequence val = tv.getText(); 
      Log.v(TAG, "value: " + val); 
      // ... rest omitted for brevity 
     } 
    }); 

कोई विचार, क्यों कॉलबैक कभी नहीं कहा जाता है?

माइकल

पीएस .: Sigh! एंड्रॉइड वास्तव में विषमता से भरा है! ऐसा लगता है कि अब तक जो कुछ भी मैंने छुआ नहीं है, वह तत्काल काम करता है जैसा कि कोई उम्मीद करेगा। और - विश्वास करो या नहीं - मुझे जीयूआई, एएसपी के साथ बहुत सारे अनुभव हैं। जावा में (एडब्ल्यूटी, स्विंग, एसडब्ल्यूटी, आप इसे नाम दें ...) लेकिन एंड्रॉइड वास्तव में एक कठिन जानवर है!

+1

@Falmarri पर एक आकर्षण की तरह, क्या उस के साथ गलत क्या है? संकल्पनात्मक रूप से, getText वर्णों का अनुक्रम देता है, इसलिए उस प्रकार के चर में वापसी मान को संग्रहीत करने के इलाज में कुछ भी गलत नहीं है। और आपको getText विधि का उपयोग करने के लिए उस कलाकार को करना है। आप टेक्स्ट व्यू लेने के लिए केवल ऑनकी विधि को नहीं बदल सकते हैं क्योंकि यह ऑनके लिस्टनर में एक विधि को ओवरराइड करता है। (निश्चित रूप से, उस पर @ ओवरराइड होना चाहिए लेकिन यह इस मामले में बहुत स्पष्ट है।) – MatrixFrog

+1

@ फ़ल्मरी: आपने स्पष्ट रूप से एंड्रॉइड के लिए प्रोग्राम नहीं किया है। मैं स्ट्रिंग्स को भी पसंद करता हूं लेकिन एंड्रॉइड हर्स स्ट्रिंग्स के बजाय चारों ओर CharSequence की जगह देता है, इसलिए आपको अक्सर यास्ट्रिंग() को अक्सर करना होता है। और यदि कोई विधि शीर्षलेख केवल "व्यू" को परिभाषित करता है लेकिन आपको पता है कि यह एक टेक्स्ट व्यू है और आपको केवल उन तरीकों की आवश्यकता है जो केवल टेक्स्ट व्यू प्रदान करते हैं, तो आप और क्या कर सकते हैं? एक बेहतर सुझाव मिला? – mmo

उत्तर

18

क्या आप संपादन टेक्स्ट में टाइप करने के लिए सॉफ्ट कीबोर्ड (ime) का उपयोग कर रहे हैं? मेरा मानना ​​है कि ऑनकेलिस्टर केवल हार्डवेयर कीबोर्ड से घटनाओं के साथ आक्रमण करता है। यदि आप कर सकते हैं तो आप टेक्स्टवॉचर का उपयोग करना बेहतर कर सकते हैं। onKeyListener not working with soft keyboard (Android)

+0

मैंने संदर्भित परिशिष्ट के माध्यम से पढ़ा और यह वास्तव में मुद्दा हो सकता है। बेशक मैंने कभी भी एक असली कीबोर्ड के साथ प्रयास नहीं किया (क्योंकि मेरे डिवाइस में कोई नहीं है ...) और एमुलेटर का कीबोर्ड स्पष्ट रूप से ऐसी घटनाओं को ट्रिगर नहीं कर रहा है। मैं सुझाए गए टेक्स्टवॉचर में बदल गया और यह चाल है! धन्यवाद! – mmo

1

आप कहते हैं कि आप एक संपादन टेक्स्ट से निपट रहे हैं, लेकिन आपका कोड टेक्स्ट व्यू को संदर्भित करता है। मेरा अनुमान है कि आपके पास अपने लेआउट एक्सएमएल फाइलों में एडिटटेक्स्ट है, लेकिन आप अपने कोड में इस नव निर्मित टेक्स्ट व्यू का जिक्र कर रहे हैं, जो वास्तव में ऐप के यूआई में भी नहीं है।

यदि आपके लेआउट XML फ़ाइल में पहले से ही एक संपादन टेक्स्ट है, तो आपको findViewById() विधि का उपयोग करके शायद अपने जावा कोड में पॉइंटर प्राप्त करने की आवश्यकता है। फिर अपने OnKeyListener को उस संपादन टेक्स्ट में जोड़ें।

एक्सएमएल में अपने लेआउट को परिभाषित करना वास्तव में एक समय में एक घटक को परिभाषित करने और फिर उन सभी घटकों को यूआई में जोड़ने की तुलना में बहुत अधिक समझ में आता है (जैसे कम से कम, मामलों में), फिर आप स्विंग में करते हैं । लेकिन कुछ लोगों को इसका कोई फायदा नहीं होता है।

+0

आप सही हैं - टेक्स्ट व्यू वास्तव में एक संपादन टेक्स्ट है और "नया" द्वारा नहीं बनाया गया है लेकिन एक inflater का उपयोग कर रहा है। मैंने इसे यहां अल्पसंख्यक के लिए बदल दिया। लेकिन मुझे अभी भी कोई भी नहीं मिला है() - कॉलबैक ... – mmo

+0

मैं गलत हो सकता था, लेकिन मुझे नहीं लगता कि आप यहां एक inflater का उपयोग करना चाहते हैं। बस 'setContentView' करें और यह आपके लिए फुलाता है। मेरा अनुमान है कि एक ही एक्सएमएल दो बार फुलाया जा रहा है - एक बार 'setContentView' के माध्यम से और एक बार' लेआउटइनफ्लेटर 'के माध्यम से।तो आपके पास एक ही लेआउट की दो प्रतियां हैं, और श्रोता को गलत में जोड़ा जा रहा है। – MatrixFrog

+0

नहीं, मुद्दा यह नहीं है कि दो प्रतियां हैं। मैं अपने स्वयं को जोड़ने शुरू करने से पहले सभी बच्चों को स्पष्ट रूप से हटा देता हूं। यह मुद्दा नीचे प्रभाव प्रतीत होता है - माया के परिशिष्ट को देखें। – mmo

7

मुझे एक ही समस्या थी, लेकिन मेरे एंड्रॉइड ऐप्स में से केवल 1 पर और मैंने कभी नहीं बताया कि अंतर क्या था।

मेरा समाधान हालांकि मैरा ने सुझाव दिया था और टेक्स्ट चेंज किए गए ईवेंट को संभालने के लिए टेक्स्टवॉचर जोड़ना था। तो यह कोई फर्क नहीं पड़ता कि पाठ प्रविष्टि कैसे होती है।

editName.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) { 
      Button btnSave = (Button)findViewById(R.id.btnSaveToon); 
      if(s.length() > 0) 
       btnSave.setEnabled(true); 
      else 
       btnSave.setEnabled(false); 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      // TODO Auto-generated method stub 
     } 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // TODO Auto-generated method stub 
     } 

    }); 

वर्क्स एमुलेटर में और मेरे एचटीसी प्रेरित

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