package edu.mit.mitmobile2; import java.util.ArrayList; import java.util.Locale; import android.app.Activity; import android.text.Spannable; import android.text.Spannable.Factory; import android.text.style.TextAppearanceSpan; import android.view.Gravity; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.TabHost; import android.widget.TextView; import android.widget.TabHost.TabSpec; public class TabConfigurator { TabHost mTabHost; Activity mActivity; ArrayList<String> mTabNames; ArrayList<Integer> mTabContentResourceIds; private int mUnderlineColor; private int mTextStyleResourceID; public TabConfigurator(Activity activity, TabHost tabHost) { mTabHost = tabHost; mActivity = activity; mTabNames = new ArrayList<String>(); mTabContentResourceIds = new ArrayList<Integer>(); mUnderlineColor = activity.getResources().getColor(R.color.tabUnderlineColor); mTextStyleResourceID = R.style.TabTitle; } public void setUnderlineColor(int underlineColor) { mUnderlineColor = underlineColor; } public void setTextStyleResID(int resID) { mTextStyleResourceID = resID; } public void addTab(String tabName, int contentId) { mTabNames.add(tabName.toUpperCase(Locale.US)); mTabContentResourceIds.add(contentId); } public void configureTabs() { int height = mActivity.getResources().getDimensionPixelSize(R.dimen.tabHeight); int displayWidth = mActivity.getWindowManager().getDefaultDisplay().getWidth(); int width = displayWidth/mTabNames.size(); int remainingWidth = displayWidth; // insure the whole width is used in cases where the division rounds off pixels Factory spanFactory = Spannable.Factory.getInstance(); for(int i = 0; i < mTabNames.size(); i++) { int tabWidth; if(i == mTabNames.size() - 1) { tabWidth = remainingWidth; } else { tabWidth = width; remainingWidth -= width; } String tabName = mTabNames.get(i); // create the content view for the tab // we use linearlayout as wrapper view (this is a work around for some strange bug // with using 9-patch backgrounds). In turn we use 9-patch backgrounds because // could not get the builtin tab dividers to display LinearLayout indicatorView = new LinearLayout(mActivity); indicatorView.setLayoutParams(new LayoutParams(tabWidth, height)); indicatorView.setBackgroundDrawable(new TabBackgroundDrawable(mActivity, mUnderlineColor)); indicatorView.setGravity(Gravity.CENTER); Spannable tabNameSpan = spanFactory.newSpannable(tabName); tabNameSpan.setSpan( new TextAppearanceSpan(mActivity, mTextStyleResourceID), 0, tabName.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); TextView textView = new TextView(mActivity); textView.setLayoutParams(new LayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT))); textView.setText(tabNameSpan); indicatorView.addView(textView); TabSpec tabSpec = mTabHost.newTabSpec(tabName); tabSpec.setIndicator(indicatorView); tabSpec.setContent(mTabContentResourceIds.get(i)); // ERROR null until AFTER addTab? mTabHost.addTab(tabSpec); } } }