寻找一个通用的TabHost风格,可以在Android,HTC Sense,三星等皮肤上工作

Android TabHost的默认样式适用于直系Android系统。 但是,在HTC Sense上,他们在深色背景上使用深色文字,这是不可读的。

来自HTC Sense UI的TabHost

在所有各种types的Android皮肤上使用可见文本的TabHost最简单的方法是什么? 如果可能,我宁愿不必制作完全自定义的外观。

我的targetSDK是10,我的MINSDK是7。

Solutions Collecting From Web of "寻找一个通用的TabHost风格,可以在Android,HTC Sense,三星等皮肤上工作"

我会告诉你完全独立于TabWidget的build议,并创build自己的导航,你可以自定义你想要的,而不用刻意的TabWidget。 我并不是想扔掉真棒的TabHost,因为用自定义导航很容易使用TabHost:

首先将你的TabWidget设置为:

<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"> <RelativeLayout 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" android:visibility="gone"/> 

然后创build自己的导航来代替它。 你也可以创build一个菜单(使用硬件菜单button)或类似的东西:

 <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"> <RelativeLayout 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" android:visibility="gone"/> <!-- content of your tabs--> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/slider_stub" android:background="@color/overview_banner_bg_down"/> <!-- custom slider with horizontal scrollable radio buttons--> <com.example.WrappingSlidingDrawer android:id="@+id/tab_slider" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:handle="@+id/tab_slider_handle" android:content="@+id/tab_scroller"> <RelativeLayout android:id="@+id/tab_slider_handle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/def_slider"> </RelativeLayout> <HorizontalScrollView android:id="@+id/tab_scroller" android:layout_width="fill_parent" android:layout_height="wrap_content" android:fadeScrollbars="false" android:scrollbarAlwaysDrawHorizontalTrack="true" android:scrollbarTrackHorizontal="@drawable/scrollbar_horizontal_track" android:scrollbarThumbHorizontal="@drawable/scrollbar_horizontal_thumb" android:fillViewport="true" android:scrollbarSize="3dip" android:fadingEdgeLength="80dp" android:background="#343534"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <RadioGroup android:id="@+id/custom_tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:gravity="center" android:orientation="horizontal" android:checkedButton="@+id/tab_overview"> <RadioButton android:id="@+id/tab_overview" android:layout_height="55dp" android:layout_width="55dp" android:button="@null" android:background="@drawable/def_checktab_overview"/> <RadioButton android:id="@+id/tab_news" android:layout_height="55dp" android:layout_width="55dp" android:button="@null" android:background="@drawable/def_checktab_news"/> .....etc....your tabs...... </RadioGroup> </RelativeLayout> </HorizontalScrollView> </com.example.WrappingSlidingDrawer> </RelativeLayout> </TabHost> 

你现在必须在代码中做什么:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_tab_layout); setTabs(); RadioGroup tabs = (RadioGroup) findViewById(R.id.custom_tabs); tabs.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.tab_overview: getTabHost().setCurrentTab(0); break; case R.id.tab_news: getTabHost().setCurrentTab(1); break; ....etc..... } } }); } /** * Delegate tab creation and adding. */ private void setTabs() { // add the necessary tabs addTab(R.string.tab_overv_tag, OverviewActivityGroup.class); addTab(R.string.tab_news_tag, NewsActivityGroup.class); .....etc..... } /** * Create a tab with an Activity and add it to the TabHost * * @param tagId * resource id of the string representing the tag for finding the tab * @param activity * the activity to be added */ private void addTab(int tagId, Class<? extends ActivityGroup> activity) { // create an Intent to launch an Activity for the tab (to be reused) Intent intent = new Intent().setClass(this, activity); // initialize a TabSpec for each tab and add it to the TabHost TabHost.TabSpec spec = usedTabHost.newTabSpec(getString(tagId)); // use layout inflater to get a view of the tab to be added View tabIndicator = getLayoutInflater().inflate(R.layout.tab_indicator, getTabWidget(), false); spec.setIndicator(tabIndicator); spec.setContent(intent); usedTabHost.addTab(spec); } 

整个指标的东西是不需要顺便说一句^^在你的ActivityGroups你必须设置适当的活动等你知道的东西。

您可以使用任何东西进行导航,并仍然可以使用TabHost的优点。 只是不要打扰那个TabWidget了。 ;)

经过一番研究,我认为最好的select是使用ActionBar的标签界面,因为它看起来更容易风格。 ActionBarSherlock为从Android 1.6开始的设备提供ActionBar兼容层。 在这里你可以看看你可以使用库的例子 。