`

TabHost眼睛会骗人

阅读更多

在上一篇文章“ TabHost 用法”中我们介绍了通过TabHost实现标签页效果。但是在实际项目中我们可能更希望定义自己的 Tab标签 样式使界面效果更佳。既然不能改变系统的 Tab 样式,那么我们可以选择隐藏系统的东西,使用自己定义的东西(这种方式很好用,以后会详细介绍)。反编译新浪微博的项目后会发现,他们在布局中隐藏了 TabWidget Tab 标签而使用一组 RadioButton 来代替。既然是自己定义的,那肯定是可以自己决定显示样式了,那我们的问题也就解决了。 这里我使用的是“ TabHost 用法—两种实现方式”一文种提到的第二种实现方式,继承 Activity 来使用 TabHost 的。先把代码贴上来(红色字体部分为修改或添加的代码)。

TabHostActivity.java

public class TabHostActivity extends Activity implements

       OnCheckedChangeListener {

    private TabHost tabHost ;

 

    private Intent certificateIntent ;

    private Intent feeIntent ;

    private Intent scoreIntent ;

    private Intent studyIntent ;

    private Intent moreIntent ;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

       super .onCreate(savedInstanceState);

       setContentView(R.layout. tab );

       // tabHost = getTabHost();

       tabHost = (TabHost) findViewById(R.id. my_tabhost );

       LocalActivityManager groupActivity =

new LocalActivityManager( this , false );

       groupActivity.dispatchCreate(savedInstanceState);

       tabHost .setup(groupActivity);

       initIntent();

       addSpec();

       ((RadioGroup) findViewById(R.id.tab_radiogroup ))

              .set OnCheckedChangeListener (this );

 

    }

 

    /**

      * 初始化各个 tab 标签对应的 intent

      */

    private void initIntent() {

       studyIntent = new Intent( this , StudyActivity. class );

       scoreIntent = new Intent( this , ScoreActivity. class );

       feeIntent = new Intent( this , FeeActivity. class );

       certificateIntent = new Intent( this , CertificateActivity. class );

       moreIntent = new Intent( this , MoreActivity. class );

    }

 

    /**

      * tabHost 添加各个标签项

      */

    private void addSpec() {

tabHost .addTab( this .buildTagSpec( "tab_study" , R.string. study_progress ,

              R.drawable. account01 , studyIntent ));

tabHost .addTab( this .buildTagSpec( "tab_score" , R.string. test_score ,

              R.drawable. account02 , scoreIntent ));

       tabHost .addTab( this .buildTagSpec( "tab_fee" , R.string. fee_pay ,

              R.drawable. account03 , feeIntent ));

       tabHost .addTab( this .buildTagSpec( "tab_certificate" ,

              R.string. certificate_grant , R.drawable. account04 ,

              certificateIntent ));

       tabHost .addTab( this .buildTagSpec( "tab_more" , R.string. more ,

              R.drawable. account05 , moreIntent ));

    }

 

    /**

      * 自定义创建标签项的方法

      * @param tagName 标签标识

      * @param tagLable 标签文字

      * @param icon 标签图标

      * @param content 标签对应的内容

      * @return

      */

    private TabHost.TabSpec buildTagSpec(String tagName, int tagLable,

           int icon, Intent content) {

       return tabHost

              .newTabSpec(tagName)

              .setIndicator(getResources().getString(tagLable),

                     getResources().getDrawable(icon)).setContent(content);

    }

 

    @Override

    public void onCheckedChanged(RadioGroup group, int checkedId) {

       switch (checkedId) {

       case R.id.radio_button_study :

           tabHost.setCurrentTabByTag("tab_study");

           break ;

       case R.id.radio_button_score :

           tabHost.setCurrentTabByTag("tab_score");

           break ;

       case R.id.radio_button_certificate :

           tabHost.setCurrentTabByTag("tab_certificate");

           break ;

       case R.id.radio_button_fee :

           tabHost.setCurrentTabByTag("tab_fee");

           break ;

       case R.id.radio_button_more :

           tabHost.setCurrentTabByTag("tab_more");

           break ;

       }

 

    }

}

tab.xml

<? xml version = "1.0" encoding = "UTF-8" ?>

< TabHost android:id = "@+id/my_tabhost" android:layout_width = "fill_parent"

          android:layout_height = "fill_parent" xmlns:android = "http://schemas.android.com/apk/res/android" >

    < LinearLayout android:orientation = "vertical"

android:layout_width = "fill_parent" android:layout_height = "fill_parent" >

       < FrameLayout android:id = "@android:id/tabcontent"

                    android:layout_width = "fill_parent" android:layout_height = "0.0dip"

                      android:layout_weight = "1.0" />

< TabWidget android:id = "@android:id/tabs" android:visibility="gone"

android:layout_width = "fill_parent" android:layout_height = "wrap_content"

                    android:layout_weight = "0.0" />

       <RadioGroup android:id="@+id/tab_radiogroup"

              android:background="@drawable/tabs_bg" android:layout_width="fill_parent"

          android:layout_height="wrap_content" android:gravity="center_vertical"

          android:layout_gravity="bottom" android:orientation="horizontal" >

           < RadioButton android:id = "@+id/radio_button_study"

              android:layout_marginTop = "2.0dip" android:text = " 学习进度 "

              android:drawableTop = "@drawable/account01" style = "@style/tab_button_bottom"

              android:checked = "true" />

           < RadioButton android:id = "@+id/radio_button_score"

              android:layout_marginTop = "2.0dip" android:text = " 考试成绩 "

              android:drawableTop = "@drawable/account02" style = "@style/tab_button_bottom" />

           < RadioButton android:id = "@+id/radio_button_certificate"

              android:layout_marginTop = "2.0dip" android:text = " 证书发放 "

              android:drawableTop = "@drawable/account03" style = "@style/tab_button_bottom" />

           < RadioButton android:id = "@+id/radio_button_fee"

              android:layout_marginTop = "2.0dip" android:text = " 费用缴纳 "

              android:drawableTop = "@drawable/account04" style = "@style/tab_button_bottom" />

           < RadioButton android:id = "@+id/radio_button_more"

              android:layout_marginTop = "2.0dip" android:text = " 更多 "

              android:drawableTop = "@drawable/account05" style = "@style/tab_button_bottom" />

       </ RadioGroup >

    </ LinearLayout >

</ TabHost >

radio_button的背景XML图

<?xml version="1.0" encoding="UTF-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/tabbar_home_f" />
    <item android:state_enabled="true" android:drawable="@drawable/tabbar_home" />
</selector>

styles.xml

<? xml version = "1.0" encoding = "utf-8" ?>

< resources >

    <!-- TabHost 标签按钮样式 -->

    < style name = "tab_button_bottom" >

       < item name = "android:textSize" > 12px </ item >

       < item name = "android:textColor" > #ffffffff </ item >

       < item name = "android:ellipsize" > marquee </ item >

       < item name = "android:gravity" > center_horizontal </ item >

       < item name = "android:background" > @drawable /tab_btn_bg </ item >

       < item name = "android:layout_marginTop" > 2.0dip </ item >

       < item name = "android:button" > @null </ item >

       < item name = "android:paddingTop" > 6dip </ item >

       < item name = "android:drawablePadding" > 4dip </ item >

       < item name = "android:layout_width" > fill_parent </ item >

       < item name = "android:layout_height" > wrap_content </ item >

       < item name = "android:layout_weight" > 1.0 </ item >

       < item name = "android:singleLine" > true </ item >

    </ style >

   

    <!-- 页面标题 LinearLayout 样式 -->

    < style name = "activity_title_background" >

    < item name = "android:background" > @drawable /title_background </ item >

       < item name = "android:layout_width" > fill_parent </ item >

       < item name = "android:layout_height" > wrap_content </ item >

       < item name = "android:layout_alignParentTop" > true </ item >

       < item name = "android:gravity" > center </ item >

    </ style >

   

    <!-- 界面标题 TextView 样式 -->

    < style name = "activity_title_text" >

       < item name = "android:textSize" > 14dip </ item >

       < item name = "android:textColor" > @drawable /white </ item >

       < item name = "android:layout_width" > wrap_content </ item >

       < item name = "android:layout_height" > wrap_content </ item >

       < item name = "android:gravity" > center </ item >

    </ style >

</ resources >

运行结果如下图所示

 

程序重要部分:

1.  红色字体部分。

2.  布局文件 tab.xml, 可以看到该布局文件中将 TabWidget 隐藏 android:visibility="gone" 而以一个 RadioGroup 取而代之。

3.  RadioGroup 设置 OnCheckedChangeListener 监听,通过 onCheckedChanged 方法对各个 RadioButton 点击事件的处理完成标签切换。

 

其实我当初考虑过为什么要用 RadioButton 而不用普通的 Button 。后来通过自己做项目,发现使用 RadioGroup 有以下优点:

1. 另外就是布局上比较方便易懂,不用再去用 LinearLayout 等布局去包含 Button

2. 我们可以很方便的获得当前选中的标签,当然通过 TabHost tabHost.getCurrentTabTag() getCurrentTab() 也是可以的。

3. 设置监听很方便,只需要为 RadioGroup 设置监听就行了,程序中对应的代码是

((RadioGroup) findViewById(R.id.tab_radiogroup ))

              .setOnCheckedChangeListener(this );

   如果用 Button 的话我们需要为所有的 Button 一个一个去设置监听,相对来说比较麻烦。

4.  或许最重要的一点是因为 RadioButton 本身就支持图片和文字的上下布局,只需指定图片和文字是什么就可以了而不需要我们自己去实现这种布局。

< RadioButton android:id = "@+id/radio_button_more"

           android:layout_marginTop = "2.0dip"

android:text=" 更多 "

           android:drawableTop="@drawable/account05"

           style = "@style/tab_button_bottom" />

 

 

分享到:
评论

相关推荐

    安卓 tabhost嵌套tabhost

    这种设计模式可以用于构建层次分明、复杂度较高的应用界面,但要注意,过多的嵌套可能会导致用户界面变得混乱,因此在实际应用中应谨慎使用。 在实际开发过程中,Android提供了其他替代方案,如FragmentTabHost和...

    Android 嵌套TabHost示例

    4. 子TabHost的创建和设置与主TabHost相似,只是它们的生命周期与主TabHost中的标签关联,当用户切换主TabHost的标签时,子TabHost也会相应地改变。 在"DoubleTabHost"这个示例中,我们可以看到如何实现这种嵌套...

    TabHost标签

    在Android开发中,`TabHost`是一个非常重要的组件,它用于创建具有标签栏的界面,让用户可以通过不同的标签在多个视图之间切换。`TabHost`是Android提供的一个容器,可以容纳多个`TabWidget`(标签)和一个`...

    TabHost的使用方法

    在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签可以展示不同的内容或活动(Activity)。本教程将详细介绍如何使用TabHost,特别适合初学者和教学场景,例如构建一个模拟...

    TabHost+ViewPager实现滑动tabhost

    `MainActivity`类中会初始化TabHost和ViewPager,`MyPagerAdapter`类作为Adapter负责填充ViewPager的内容。每个Tab下的页面可能由`Fragment`实现,如`Page1Fragment`、`Page2Fragment`等,这些Fragment对应TabHost的...

    TabHost的各种实现方式

    - 创建TabHost实例:通常我们会在布局XML文件中定义一个TabHost,并在Java代码中通过`findViewById()`获取它。 - 添加Tab:使用`TabHost.addTab()`方法来添加新的Tab。这个方法需要传递四个参数:TabSpec(Tab的...

    TabHost两种实现方式

    在Android开发中,TabHost是一个重要的组件,用于创建带有可切换标签的用户界面。这篇博客“TabHost两种实现方式”探讨了如何在Android应用中使用TabHost来构建多标签视图。下面我们将深入讨论这两种实现方式及其...

    解决TabHost下面白线

    然而,在实际使用过程中,开发者经常会遇到一个问题:TabHost下方会出现一条不期望的白色线条。这个问题可能是由于布局设置不当或者主题样式覆盖不完整导致的。本文将详细介绍如何使用TabHost实现分页应用,并针对...

    android tabhost用法 源码

    当用户点击不同的Tab时,TabHost会根据设置的Intent切换到相应的Activity或替换FrameLayout中的内容。 二、创建TabHost 首先,你需要在布局文件中添加TabHost,并为其设置ID为"@android:id/tabhost"。接着,在...

    tabhost单例模式小例子

    在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签页可以关联到不同的Activity或View。本示例是关于如何使用TabHost实现单例模式的小例子,旨在帮助开发者理解如何在TabHost...

    ViewPager和Tabhost结合,可滑动的tabhost

    当用户切换标签或滑动 `ViewPager` 时,此监听器会更新选中的标签。 4. **添加TabHost的标签**:将创建好的 `TabSpec` 添加到 `TabHost`,并调用 `TabHost.setup()` 初始化 `TabHost`。 5. **处理页面切换事件**:...

    TabHost中填充自定义ListView

    这个布局文件会被`Adapter`的`getView()`方法加载并填充数据。 为了将自定义`ListView`添加到`TabHost`的一个`Tab`中,你需要: 1. 创建一个新的Activity或Fragment来展示`ListView`,并在这个Activity或Fragment...

    android-->tabHost

    - `TabHost`中的`Activity`默认是以栈的形式管理,点击新选项卡会将当前`Activity`压入栈底,新的`Activity`位于栈顶。如果希望切换时不创建新的`Activity`实例,可以使用`SingleTop`启动模式。 - `TabHost`在...

    底部tabhost嵌套顶不tabhost.

    在底部的TabHost中,我们会设置多个标签,每个标签对应一个不同的Activity或Fragment,用户可以通过点击这些标签在不同的内容之间切换。 然后,我们来讨论如何在底部TabHost中的某个Activity或Fragment内嵌套一个...

    Android TabHost TabWidget 切换卡

    在`MyTabHost`这个项目中,你可能会看到一个完整的`TabHost`和`TabWidget`的示例实现,包括XML布局文件和对应的Activity代码。通过分析这个项目,你可以更深入地了解如何在实际应用中使用这些组件。

    android Tabhost使用Demo

    在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签页可以承载不同的活动(Activity)或视图。本Demo主要展示了如何在Android应用中使用TabHost来构建一个多标签的用户界面。...

    TabHost和ViewPage源码

    但`TabPageIndicator`在某些老版本库中仍被使用),这是一个视图,可以模拟`TabHost`的外观,但它与`ViewPager`协作,当用户在`ViewPager`中滑动时,`TabPageIndicator`的标签也会相应更新。具体步骤如下: 1. 在...

    TabHost的简单使用

    在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个选项卡的用户界面,每个选项卡都可以展示不同的内容或活动(Activity)。TabHost结合TabWidget和FrameLayout工作,TabWidget用于显示选项卡,而...

    tabHost滑动切换选项卡 tabHost ViewPager

    在TabHost中,我们通常会设置一个TabSpec对象,用于定义每个选项卡的内容和显示的标签文字。 **ViewPager** 是Android Support Library中的组件,它提供了一个可以左右滑动查看多个页面的界面。ViewPager通常配合...

    嵌套TabHost

    在实现嵌套TabHost时,我们通常会遇到以下步骤: 1. **创建主TabHost**:首先,你需要创建一个主TabHost,并为其添加若干个Tab。每个Tab可能关联一个Activity,该Activity内部又包含了一个子TabHost。 2. **创建子...

Global site tag (gtag.js) - Google Analytics