Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to use ActionBarSherlock style on native TabWidget?

I am wondering is it possible to apply ActionBarSherlock (v4.2.0) TabWidget theme on native TabWidget? So it will looks like Holo on pre ICS androids. If you know how - please share.

All i found is this: https://gist.github.com/1126843 but it seems not work anymore.

Standard xml layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
            </TabWidget>

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >
            </FrameLayout>
        </LinearLayout>
    </TabHost>
</LinearLayout>
like image 367
Androider Avatar asked Nov 03 '12 16:11

Androider


1 Answers

I found some solution myself. It's not pure ABS resources but use minimum additional things:

Almost same as ABS selector except

<item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/abs__ab_transparent_light_holo" />

tab_indicator_compat_holo.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Non focused states -->
<item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/abs__ab_transparent_light_holo" />
<item android:state_focused="false" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/abs__tab_selected_holo" />

<!-- Focused states -->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/abs__list_focused_holo" />
<item android:state_focused="true" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/abs__tab_selected_focused_holo" />

<!-- Pressed -->
<!--    Non focused states -->
<item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/abs__list_pressed_holo_dark" />
<item android:state_focused="false" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/abs__tab_selected_pressed_holo" />

<!--    Focused states -->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/abs__tab_unselected_pressed_holo" />
<item android:state_focused="true" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/abs__tab_selected_pressed_holo" />

Activity

private void initTabs(){
    TabHost tabHost = (TabHost)getView().findViewById(android.R.id.tabhost);
    tabHost.setup();

    TabSpec podcasts_all = tabHost.newTabSpec("tab1");
    TabSpec podcasts_downloaded = tabHost.newTabSpec("tab2");
    TabSpec podcasts_favorite = tabHost.newTabSpec("tab3");


    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB){
        //set divider drawable

        tabHost.getTabWidget().setDividerDrawable(com.actionbarsherlock.R.drawable.abs__list_divider_holo_light);

        //set tab titles with custom view
        podcasts_all.setIndicator(customTabTextView(getSherlockActivity().getString(R.string.PodcastManager_All_Title)));
        podcasts_downloaded.setIndicator(customTabTextView(getSherlockActivity().getString(
                R.string.PodcastManager_Downloaded_Title)));
        podcasts_favorite.setIndicator(customTabTextView(getSherlockActivity().getString(
                R.string.PodcastManager_Favorite_Title)));
    }else{
        //set tab titles
        podcasts_all.setIndicator(getSherlockActivity().getString(R.string.PodcastManager_All_Title));
        podcasts_downloaded.setIndicator(getSherlockActivity().getString(
                R.string.PodcastManager_Downloaded_Title));
        podcasts_favorite.setIndicator(getSherlockActivity().getString(R.string.PodcastManager_Favorite_Title));
    }


    tabHost.addTab(podcasts_all);
    tabHost.addTab(podcasts_downloaded); 
    tabHost.addTab(podcasts_favorite); 


    //fill background with selector drawable
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB){
        setTabsBackground(tabHost);
    }

}

private View customTabTextView(String text){
    TextView txtTab = new TextView(getActivity());
    txtTab.setText(text.toUpperCase());
    txtTab.setPadding(0, 5, 0, 0);
    txtTab.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
    txtTab.setTextColor(Color.DKGRAY);
    txtTab.setGravity(Gravity.CENTER);
    txtTab.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
    txtTab.setHeight(34);

    return txtTab;
}

private void setTabsBackground(TabHost tabHost) {
    View v;
    int count = tabHost.getTabWidget().getTabCount();
    for (int i = 0; i < count; i++) {
        v = tabHost.getTabWidget().getChildTabViewAt(i);
        v.setBackgroundResource(R.drawable.tab_indicator_compat_holo);

        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
        //Fix margins in 2.x, by default there is -2  
        params.setMargins(0, 0, 0, 0);
    }
}
like image 79
Androider Avatar answered Sep 28 '22 09:09

Androider