2011-05-22 11 views
6

TextSwitcherListView पंक्ति (xml में परिभाषित) का हिस्सा है। मैं setViewValue में TextSwitcher के पाठ को परिभाषित:टेक्स्टस्विचर के लिए setCurrentText या setText का उपयोग करते समय मुझे NullPointerException क्यों मिलता है?

switch(viewId) { 
case R.id.tw_text: 
    TextSwitcher twText = (TextSwitcher) view; 
    twText.setCurrentText("test text"); 
    return true; 

इस कोड को पूरी तरह से काम करता है अगर twTextTextView है। लेकिन यह TextSwitcher साथ NullPointerException रिटर्न:

05-22 10:24:08.781: ERROR/AndroidRuntime(3348): FATAL EXCEPTION: main 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348): java.lang.NullPointerException 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.TextSwitcher.setCurrentText(TextSwitcher.java:89) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at my.package.MainActivity$1.setViewValue(MainActivity.java:87) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:126) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.CursorAdapter.getView(CursorAdapter.java:186) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.AbsListView.obtainView(AbsListView.java:1315) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1198) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.ListView.onMeasure(ListView.java:1109) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:696) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:306) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:381) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:526) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.View.measure(View.java:8171) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewRoot.performTraversals(ViewRoot.java:801) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.os.Looper.loop(Looper.java:123) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-22 10:24:08.781: ERROR/AndroidRuntime(3348):  at dalvik.system.NativeStart.main(Native Method) 

अद्यतन 1: looks like मैं() मेरी कोड को setFactory जोड़ने की जरूरत है। लेकिन अगर मैं निम्न कार्य करें:

TextSwitcher twText = (TextSwitcher) view; 
    twText.setFactory(new ViewSwitcher.ViewFactory() { 
     @Override 
     public View makeView() { 
     TextView t = new TextView(MainActivity.this); 
     return t; 
     } 
     }); 

मैं एक त्रुटि हो रही है:

05-22 10:54:42.852: ERROR/AndroidRuntime(3907): java.lang.IllegalStateException: Can't add more than 2 views to a ViewSwitcher 
05-22 10:54:42.852: ERROR/AndroidRuntime(3907):  at android.widget.ViewSwitcher.addView(ViewSwitcher.java:64) 
05-22 10:54:42.852: ERROR/AndroidRuntime(3907):  at android.widget.TextSwitcher.addView(TextSwitcher.java:67) 
05-22 10:54:42.852: ERROR/AndroidRuntime(3907):  at android.view.ViewGroup.addView(ViewGroup.java:1845) 

अद्यतन 2: मैं twText.setFactory() से पहले twText.removeAllViews() जोड़ दिया है। यह काम करता है, लेकिन फिर से दृश्यों को हटाने और जोड़ने का सबसे अच्छा तरीका नहीं दिखता है। मैं कैसे देख सकता हूं कि दृश्य पहले से मौजूद हैं या नहीं?

इसके अलावा, मैं xml में अपने टेक्स्टस्विचर की स्वरूपण/शैली रखना चाहता हूं। सेट फैक्ट्री का उपयोग मुझे ऐसा करने की अनुमति नहीं देता है। मैं क्या कर सकता हूँ?

उत्तर

6

ऐसा लगता है कि setCurrentText पर बिंदु स्विचर में कोई दृश्य नहीं जोड़ा गया है। यह विधि मूल रूप से केवल वर्तमान पाठ दृश्य प्राप्त करती है और इसके लिए पाठ सेट करती है, इसलिए यदि NullPointerException प्रकट होता है, तो यह केवल टेक्स्ट स्विचर में दृश्यों की अनुपस्थिति के कारण हो सकता है।

कारखाने के साथ त्रुटि के संबंध में: आपको या तो कारखाने को सेट करने या स्वयं को दो विचार जोड़ने के लिए सावधान रहना होगा।

  • कॉल setFactory जो दो दृश्य पैदा करेगा: आप इन विकल्पों में से किसी की है।
  • addView पर कॉल करके मैन्युअल रूप से दो विचार जोड़ें।

दोनों मामलों में केवल दो विचार हो सकते हैं, और कम नहीं। यदि आप एक कारखाना सेट करते हैं और कुछ विचार पहले ही जोड़े जा चुके हैं, तो आपको एक त्रुटि मिल जाएगी। आप देख सकते हैं आप की जाँच क्या getChildCount() विधि रिटर्न द्वारा एक कारखाने स्थापित करने की आवश्यकता है, तो इस पर

TextSwitcher switcher = (TextSwitcher) view; 
if (switcher.getChildCount() != 2) { 
    switcher.removeAllViews(); 
    switcher.setFactory(new ViewSwitcher.ViewFactory() { 
     @Override 
     public View makeView() { 
      return new TextView(MainActivity.this); 
     } 
    }); 
} 
+0

मैं 'setCurrentText' और' setText' साथ परीक्षण किया है दोनों कि। आप सही हैं कि मैंने वहां कोई दृश्य नहीं जोड़ा है (अजीब, कि यह डिफ़ॉल्ट रूप से नहीं जोड़ा गया है)। लेकिन मैं इसे कैसे जोड़ सकता हूं? कृपया मेरा अद्यतन प्रश्न देखें। –

+0

आपकी मदद के लिए धन्यवाद। मैं 'addView' का उपयोग नहीं करता हूं। तो, ऐसा लगता है कि 'व्यू को स्वचालित रूप से जोड़ा जाता है, क्योंकि मैं अपने xml में' TextSwitcher' का उपयोग करता हूं। लेकिन किसी भी तरह से मैं उनका उपयोग नहीं कर सकता।या, यह 'सेट फैक्ट्री' कोड कई बार कहा जाता है (लेकिन मेरी समझ यह थी कि हर बार जब यह नए दृश्य बनाता है)। मैंने फिर से प्रश्न अपडेट किया है। –

+0

xml में परिभाषित टेक्स्टस्विचर की शैली (फ़ॉन्ट आकार, रंग, स्थिति इत्यादि) का उपयोग करने के लिए टेक्स्टस्विचर विचारों को बल देने के लिए मुझे क्या करना चाहिए? –

0

शायद एक छोटे से बहुत देर हो चुकी है, लेकिन मैं जब तक मैं मेरा का उत्तर खोज रहा था अपने प्रश्न पाया। मुझे एक ही त्रुटि मिल रही थी, सेटफैक्टरी को कॉल करने का प्रयास करते समय एक खाली टेक्स्टस्विचर में, 2 से अधिक विचार जोड़ नहीं सकते ...। जब मैंने एक्शनबार एक्टिविटी के बजाए गतिविधि को विस्तारित करने के लिए अपनी गतिविधि बदल दी तो मेरी समस्या का समाधान हो गया। उम्मीद है कि इससे भविष्य में कुछ लोगों की मदद मिलेगी। त्रुटि एक ही (हां, मैं तो बस लिया है पुराने कोड और नए लॉग;) है -

TextSwitcher throwing "more than 2 views" error when setFactory() is called

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

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