Create Smaller Tabs in Android
Asked Answered
D

2

6

I am trying to create smaller tabs in android -- but I can't seem to get it to work because all that happens when I create a smaller tab is that it shows the bigger tab -- but without a drawable.

This is my layout code for tabs now -- but the height isn't wrapping for some reason -- it just goes to Android's usual layout height.

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout android:orientation="vertical"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <TabWidget android:id="@android:id/tabs"
            android:layout_width="fill_parent" android:layout_height="wrap_content" />
        <FrameLayout android:id="@android:id/tabcontent"
            android:layout_width="fill_parent" android:layout_height="fill_parent">
        </FrameLayout>
    </LinearLayout>
</TabHost>

It would be great if someone could help me create something like the Facebook application -- I think that looks really clean and I would love to implement something like it:

Deplete answered 21/8, 2010 at 20:55 Comment(0)
T
7

Well this was far more complicated than I thought it should be but, nevertheless, this should get you a basic implementation of the appearance that you want...

 TabHost             host       = getTabHost();
 TabSpec             spec       = null;
 TextView            tab1       = null,
                     tab2       = null;
 Intent              intent     = null;
 Resources           resources  = getResources();
 XmlResourceParser   parser     = null;
 ColorStateList      text       = null;
 StateListDrawable[] drawables  = new StateListDrawable[2];
 int[]               selected   = {STATE_SELECTED},
                     unselected = {STATE_UNSELECTED};
 Color               selectedColor = Color.argb(255, 255, 255, 255),
                     defaultColor  = Color.argb(255, 119, 119, 119);

 // Load the colour lists.
 parser = resources.getXml(R.color.tab_text);
 text   = ColorStateList.createFromXml(getResources(), parser);

 // Add an initial tab.
 ...Create Tab Contents Here...
 spec = host.newTabSpec("tab1");
 tab1 = new TextView(this);
 tab1.setText(R.string.all_tab_title);
 tab1.setGravity(android.view.Gravity.CENTER);
 tab1.setTextSize(18.0f);
 tab1.setTextColor(text);
 spec.setIndicator(tab1);
 spec.setContent(intent);
 host.addTab(spec);

 // Add a second tab.
 ...Create Tab Contents Here...
 spec = host.newTabSpec("tab2");
 tab2 = new TextView(this);
 tab2.setText(R.string.category_tab_title);
 tab2.setGravity(android.view.Gravity.CENTER);
 tab2.setTextSize(18.0f);
 tab2.setTextColor(text);
 spec.setIndicator(tab2);
 spec.setContent(intent);
 host.addTab(spec);

 // Set the background drawable for the tabs and select the first tab.
 drawables[0] = new StateListDrawable();
 drawables[0].addState(selected, new ColorDrawable(selectedColor));
 drawables[0].addState(unselected, new ColorDrawable(defaultColor));
 drawables[1] = new StateListDrawable();
 drawables[1].addState(selected, new ColorDrawable(selectedColor));
 drawables[1].addState(unselected, new ColorDrawable(defaultColor));
 tab1.setBackgroundDrawable(drawables[0]);
 tab2.setBackgroundDrawable(drawables[1]);
 host.setCurrentTab(0);

This won't account for tab borders or the spacing between elements though. You also need a colour state list definition like the following in the ./res/color directory...

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_selected="true" android:color="#ff000000" />
   <item android:state_selected="false" android:color="#ffaaaaaa" />
   <item android:color="#ffffffff"/>
</selector>

Hope that helps.

Typo answered 24/9, 2010 at 13:56 Comment(4)
Wow, this is definitely a lot more than I was looking for, I guess I'll accept this answer until someone posts a more surefire way.Deplete
STATE_SELECTED and STATE_UNSELECTED are supposed to be id's of what?Interwork
@Interwork - Apologies for neglecting these definitions. STATE_SELECTED is defined as being equal to android.R.attr.state_selected. STATE_UNSELECTED is equal to STATE_SELECTED * -1.Typo
@Jay - I can't seem to comment on your answer so I'll put my solution here. What I did was use a nested view with three levels. The outer level provided the inter-tab spacing. The middle level provided the border. The inner level provided the actual tab content. All three combined where to make the entire tab control. Again, kinda complicated I know. Hope this makes sense.Typo
H
3

Saw this in another forum, but figured I'd pass it on here.


TabHost th = getTabHost();
....
// Setup all the tabs -- in my case, with text only -- no icons
....
int iCnt = th.getTabWidget().getChildCount();
for(int i=0; i<iCnt; i++)
  th.getTabWidget().getChildAt(i).getLayoutParams().height /= 2;  // Or the size desired
Hurwitz answered 23/2, 2011 at 15:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.