OSDN Git Service

Fix TabHost NPE when there are no tabs
authorBjorn Bringert <bringert@android.com>
Thu, 10 Dec 2009 15:58:49 +0000 (15:58 +0000)
committerBjorn Bringert <bringert@android.com>
Fri, 11 Dec 2009 15:48:31 +0000 (15:48 +0000)
Fixes http://b/issue?id=2318588

Change-Id: If90ee7e2b777e4c77fdd0ae768d1ececa792ee1b

core/java/android/widget/TabHost.java
core/java/android/widget/TabWidget.java

index 31920e7..412f817 100644 (file)
@@ -279,6 +279,7 @@ mTabHost.addTab(TAB_TAG_1, "Hello, world!", "Tab 1");
         if (!handled
                 && (event.getAction() == KeyEvent.ACTION_DOWN)
                 && (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP)
+                && (mCurrentView != null)
                 && (mCurrentView.isRootNamespace())
                 && (mCurrentView.hasFocus())
                 && (mCurrentView.findFocus().focusSearch(View.FOCUS_UP) == null)) {
@@ -292,7 +293,9 @@ mTabHost.addTab(TAB_TAG_1, "Hello, world!", "Tab 1");
 
     @Override
     public void dispatchWindowFocusChanged(boolean hasFocus) {
-        mCurrentView.dispatchWindowFocusChanged(hasFocus);
+        if (mCurrentView != null){
+            mCurrentView.dispatchWindowFocusChanged(hasFocus);
+        }
     }
 
     public void setCurrentTab(int index) {
index 2ba6268..c12d098 100644 (file)
@@ -183,7 +183,7 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener {
 
     @Override
     public void childDrawableStateChanged(View child) {
-        if (child == getChildTabViewAt(mSelectedTab)) {
+        if (getTabCount() > 0 && child == getChildTabViewAt(mSelectedTab)) {
             // To make sure that the bottom strip is redrawn
             invalidate();
         }
@@ -194,6 +194,9 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener {
     public void dispatchDraw(Canvas canvas) {
         super.dispatchDraw(canvas);
 
+        // Do nothing if there are no tabs.
+        if (getTabCount() == 0) return;
+
         // If the user specified a custom view for the tab indicators, then
         // do not draw the bottom strips.
         if (!mDrawBottomStrips) {
@@ -347,7 +350,7 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener {
     }
 
     public void onFocusChange(View v, boolean hasFocus) {
-        if (v == this && hasFocus) {
+        if (v == this && hasFocus && getTabCount() > 0) {
             getChildTabViewAt(mSelectedTab).requestFocus();
             return;
         }