天天看点

NullPointException-TabWidget.focusCurrentTab(TabWidget.java:401)

错误提示如下:

AndroidRuntime(): java.lang.NullPointerException
AndroidRuntime(): at android.widget.TabWidget.
    focusCurrentTab(TabWidget.java:)
AndroidRuntime(): at android.widget.TabHost.
    setCurrentTab(TabHost.java:)
AndroidRuntime(): at android.widget.TabHost$2.
    onTabSelectionChanged(TabHost.java:)
AndroidRuntime(): at android.widget.TabWidget$
    TabClickListener.onClick(TabWidget.java:)
AndroidRuntime(): at android.view.View.
    performClick(View.java:)
           

错误提示范围

Android手机 系统版本2.3.7及2.3.7以下

错误原因

获取不到TabWidget中的ChildView,抛出空指针异常。

提醒

TabWidget中的text以及下划线属于TabWidget的子View,而在查找子View时,如果所有TabWidget都设置了text和下划线的话,一个TabWidget算有2个子View.

错误分析

Android 源码2.3.7及2.3.7以前,TabWidget中的getChildTabViewAt(int index)源码如下:

public View ..getChildTabViewAt(int index) {
      // If we are using dividers, then instead of tab views at , , , ...
      // we have tab views at , , , ...
    if (mDividerDrawable != null) {
      index *= ;
    }
     return getChildAt(index);
 }
           

假如我们项目中设置了mDividerDrawable又没用,导致点击第三个tab(或者其他TabWidget,排除第1个TabWidget)的时候,index=2*3=6,导致找不到childView.

错误解决办法

删掉多余的代码

TabWidget.setDividerDrawable();

错误扩展

为何4.x.x以上系统不会抛出该异常呢?

Android 源码4.x.x以上系统,TabWidget中的getChildTabViewAt(int index)源码如下:

public View More ...getChildTabViewAt(int index) {
   return getChildAt(index);
 }