/** Removes all tabs from the tab widget associated with this tab host. */
 public void clearAllTabs() {
   mTabWidget.removeAllViews();
   initTabHost();
   mTabContent.removeAllViews();
   mTabSpecs.clear();
   requestLayout();
   invalidate();
 }
 /** {@inheritDoc} */
 public void onTouchModeChanged(boolean isInTouchMode) {
   if (!isInTouchMode) {
     // leaving touch mode.. if nothing has focus, let's give it to
     // the indicator of the current tab
     if (!mCurrentView.hasFocus() || mCurrentView.isFocused()) {
       mTabWidget.getChildTabViewAt(mCurrentTab).requestFocus();
     }
   }
 }
  public void setCurrentTab(int index) {
    if (index < 0 || index >= mTabSpecs.size()) {
      return;
    }

    if (index == mCurrentTab) {
      return;
    }

    // notify old tab content
    if (mCurrentTab != -1) {
      mTabSpecs.get(mCurrentTab).mContentStrategy.tabClosed();
    }

    mCurrentTab = index;
    final TabHost.TabSpec spec = mTabSpecs.get(index);

    // Call the tab widget's focusCurrentTab(), instead of just
    // selecting the tab.
    mTabWidget.focusCurrentTab(mCurrentTab);

    // tab content
    mCurrentView = spec.mContentStrategy.getContentView();

    if (mCurrentView.getParent() == null) {
      mTabContent.addView(
          mCurrentView,
          new ViewGroup.LayoutParams(
              ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
    }

    if (!mTabWidget.hasFocus()) {
      // if the tab widget didn't take focus (likely because we're in touch mode)
      // give the current tab content view a shot
      mCurrentView.requestFocus();
    }

    // mTabContent.requestFocus(View.FOCUS_FORWARD);
    invokeOnTabChangeListener();
  }
  /**
   * Add a tab.
   *
   * @param tabSpec Specifies how to create the indicator and content.
   */
  public void addTab(TabSpec tabSpec) {

    if (tabSpec.mIndicatorStrategy == null) {
      throw new IllegalArgumentException("you must specify a way to create the tab indicator.");
    }

    if (tabSpec.mContentStrategy == null) {
      throw new IllegalArgumentException("you must specify a way to create the tab content");
    }
    View tabIndicator = tabSpec.mIndicatorStrategy.createIndicatorView();
    tabIndicator.setOnKeyListener(mTabKeyListener);

    // If this is a custom view, then do not draw the bottom strips for
    // the tab indicators.
    if (tabSpec.mIndicatorStrategy instanceof ViewIndicatorStrategy) {
      mTabWidget.setDrawBottomStrips(false);
    }
    mTabWidget.addView(tabIndicator);
    mTabSpecs.add(tabSpec);

    if (mCurrentTab == -1) {
      setCurrentTab(0);
    }
  }
  @Override
  public boolean dispatchKeyEvent(KeyEvent event) {
    final boolean handled = super.dispatchKeyEvent(event);

    // unhandled key ups change focus to tab indicator for embedded activities
    // when there is nothing that will take focus from default focus searching
    if (!handled
        && (event.getAction() == KeyEvent.ACTION_DOWN)
        && (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP)
        && (mCurrentView.isRootNamespace())
        && (mCurrentView.hasFocus())
        && (mCurrentView.findFocus().focusSearch(View.FOCUS_UP) == null)) {
      mTabWidget.getChildTabViewAt(mCurrentTab).requestFocus();
      playSoundEffect(SoundEffectConstants.NAVIGATION_UP);
      return true;
    }
    return handled;
  }
  /**
   * <p>Call setup() before adding tabs if loading TabHost using findViewById().
   * <i><b>However</i></b>: You do not need to call setup() after getTabHost()
   * in {@link android.app.TabActivity TabActivity}.
   * Example:</p>
   * <pre>mTabHost = (TabHost)findViewById(R.id.tabhost);
   * mTabHost.setup();
   * mTabHost.addTab(TAB_TAG_1, "Hello, world!", "Tab 1");
   */
  public void setup() {
    mTabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs);
    if (mTabWidget == null) {
      throw new RuntimeException(
          "Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'");
    }

    // KeyListener to attach to all tabs. Detects non-navigation keys
    // and relays them to the tab content.
    mTabKeyListener =
        new OnKeyListener() {
          public boolean onKey(View v, int keyCode, KeyEvent event) {
            switch (keyCode) {
              case KeyEvent.KEYCODE_DPAD_CENTER:
              case KeyEvent.KEYCODE_DPAD_LEFT:
              case KeyEvent.KEYCODE_DPAD_RIGHT:
              case KeyEvent.KEYCODE_DPAD_UP:
              case KeyEvent.KEYCODE_DPAD_DOWN:
              case KeyEvent.KEYCODE_ENTER:
                return false;
            }
            mTabContent.requestFocus(View.FOCUS_FORWARD);
            return mTabContent.dispatchKeyEvent(event);
          }
        };

    mTabWidget.setTabSelectionListener(
        new TabWidget.OnTabSelectionChanged() {
          public void onTabSelectionChanged(int tabIndex, boolean clicked) {
            setCurrentTab(tabIndex);
            if (clicked) {
              mTabContent.requestFocus(View.FOCUS_FORWARD);
            }
          }
        });

    mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent);
    if (mTabContent == null) {
      throw new RuntimeException(
          "Your TabHost must have a FrameLayout whose id attribute is "
              + "'android.R.id.tabcontent'");
    }
  }
 public View getCurrentTabView() {
   if (mCurrentTab >= 0 && mCurrentTab < mTabSpecs.size()) {
     return mTabWidget.getChildTabViewAt(mCurrentTab);
   }
   return null;
 }