2011-05-22 120 views
6

TextSwitcherListView行的一部分(在xml中定義)。 我定義的setViewValue TextSwitcher全文:爲什麼在爲TextSwitcher使用setCurrentText或setText時會得到NullPointerException?

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

此代碼工作完全如果twTextTextView。但它返回NullPointerException異常與TextSwitcher

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) 

更新1looks 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()。它可以工作,但看起來不是再次刪除和添加視圖的最佳方式。我如何檢查視圖是否已經存在?

此外,我想保持我的TextSwitcher的格式/風格在XML中。 setFactory的使用不允許我這樣做。我能做什麼?

回答

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' - 錯誤是一樣的(所以,我剛舊的代碼和新的日誌)。你說得對,我沒有添加任何查看(奇怪的是,它沒有默認添加)。但我如何添加它?請看我更新的問題。 – 2011-05-22 10:55:30

+0

感謝您的幫助。我不使用'addView'。所以,看起來像'View's是自動添加的,因爲我在我的xml中使用了'TextSwitcher'。但不知何故,我不能使用它們。或者,這個'setFactory'代碼被多次調用(但我的理解是每次它在那裏創建新的視圖)。我再次更新了這個問題。 – 2011-05-22 11:18:37

+0

我該如何強制TextSwitcher視圖使用xml中定義的TextSwitcher的樣式(字體大小,顏色,位置等)? – 2011-05-22 11:36:54

0

可能有點太晚了這個,但我發現你的問題,而我正在尋找的答案,我的。在嘗試調用setFactory時,我在一個空的TextSwitcher中遇到類似的錯誤,無法添加多於2個視圖...。當我將活動更改爲擴展Activity而不是ActionBarActivity時,我的問題得到了解決。希望這會在未來幫助一些人。

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

相關問題