`

新浪微博布局学习——妙用TabHost

阅读更多

 

前言

  为了更好的开发Android应用程序,除了熟练掌握基本的UI组件和API外,还需要掌握一些技巧,而这些技巧可以通过阅读一些代码来提高,本系列将与大家分享一些新浪微博布局方面的收获,欢迎交流!

 

声明

  欢迎转载,但请保留文章原始出处:)

    博客园:http://www.cnblogs.com

    农民伯伯: http://www.cnblogs.com/over140

 

版本

  新浪微博 weibo_10235010.apk

 

正文

  一、效果图

    

    红色部分是本文要实现的目标。

 

  二、实现maintabs.xml

<?xml version="1.0" encoding="UTF-8"?>
<TabHost android:id="@android:id/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:gravity="center_vertical" android:layout_gravity="bottom" android:orientation="horizontal" android:id="@id/main_radio" android:background="@drawable/maintab_toolbar_bg" android:layout_width="fill_parent" android:layout_height="wrap_content">
            <RadioButton   android:text="@string/main_home" android:checked="true" android:id="@+id/radio_button0" android:layout_marginTop="2.0dip" android:drawableTop="@drawable/icon_1_n" style="@style/main_tab_bottom" />
            <RadioButton android:id="@+id/radio_button1" android:layout_marginTop="2.0dip" android:text="@string/main_news" android:drawableTop="@drawable/icon_2_n" style="@style/main_tab_bottom" />
            <RadioButton android:id="@+id/radio_button2" android:layout_marginTop="2.0dip" android:text="@string/main_my_info" android:drawableTop="@drawable/icon_3_n" style="@style/main_tab_bottom" />
            <RadioButton android:id="@+id/radio_button3" android:layout_marginTop="2.0dip" android:text="@string/menu_search" android:drawableTop="@drawable/icon_4_n" style="@style/main_tab_bottom" />
            <RadioButton android:id="@+id/radio_button4" android:layout_marginTop="2.0dip" android:text="@string/more" android:drawableTop="@drawable/icon_5_n" style="@style/main_tab_bottom" />
        </RadioGroup>
    </LinearLayout>
</TabHost>
 

    styles.xml

 <style name="main_tab_bottom">
        <item name="android:textSize">@dimen/bottom_tab_font_size</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/home_btn_bg</item>
        <item name="android:paddingTop">@dimen/bottom_tab_padding_up</item>
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:button">@null</item>
        <item name="android:singleLine">true</item>
        <item name="android:drawablePadding">@dimen/bottom_tab_padding_drawable</item>
        <item name="android:layout_weight">1.0</item>
    </style>
 

     home_btn_bg.xml

      
 <selector
          xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:state_focused="true" android:state_enabled="true" android:state_pressed="false" android:drawable="@drawable/home_btn_bg_s" />
            <item android:state_enabled="true" android:state_pressed="true" android:drawable="@drawable/home_btn_bg_s" />
            <item android:state_enabled="true" android:state_checked="true" android:drawable="@drawable/home_btn_bg_d" />
            <item android:drawable="@drawable/transparent" />
        </selector>
 

    代码说明:

        1.  需要注意的是他这里把TabWidget的Visibility设置成了gone!也就是默认难看的风格不见了: ,取而代之的是5个带风格的单选按钮.

        2.  注意为单选按钮设置的style,其中最重要的是为其background设置了home_btn_bg.xml,也就是自定义了选中效果。

    Java文件

public class MainTabActivity extends TabActivity implements
        OnCheckedChangeListener {

    private TabHost mHost;
    private Intent mMBlogIntent;
    private Intent mMoreIntent;
    private Intent mInfoIntent;
    private Intent mSearchIntent;
    private Intent mUserInfoIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.maintabs);

        // ~~~~~~~~~~~~ 初始化
        this.mMBlogIntent = new Intent(this, HomeListActivity.class);
        this.mSearchIntent = new Intent(this, SearchSquareActivity.class);
        this.mInfoIntent = new Intent(this, MessageGroup.class);
        this.mUserInfoIntent = new Intent(this, MyInfoActivity.class);
        this.mMoreIntent = new Intent(this, MoreItemsActivity.class);

        initRadios();
        
        setupIntent();
    }

    /**
     * 初始化底部按钮
     */
    private void initRadios() {
         ((RadioButton) findViewById(R.id.radio_button0)).setOnCheckedChangeListener(this);
         ((RadioButton) findViewById(R.id.radio_button1)).setOnCheckedChangeListener(this);
         ((RadioButton) findViewById(R.id.radio_button2)).setOnCheckedChangeListener(this);
         ((RadioButton) findViewById(R.id.radio_button3)).setOnCheckedChangeListener(this);
         ((RadioButton) findViewById(R.id.radio_button4)).setOnCheckedChangeListener(this);
    }

    /**
     * 切换模块
     */
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            switch (buttonView.getId()) {
            case R.id.radio_button0:
                this.mHost.setCurrentTabByTag("mblog_tab");
                break;
            case R.id.radio_button1:
                this.mHost.setCurrentTabByTag("message_tab");
                break;
            case R.id.radio_button2:
                this.mHost.setCurrentTabByTag("userinfo_tab");
                break;
            case R.id.radio_button3:
                this.mHost.setCurrentTabByTag("search_tab");
                break;
            case R.id.radio_button4:
                this.mHost.setCurrentTabByTag("more_tab");
                break;
            }
        }
    }

    private void setupIntent() {
        this.mHost = getTabHost();
        TabHost localTabHost = this.mHost;

        localTabHost.addTab(buildTabSpec("mblog_tab", R.string.main_home,
                R.drawable.icon_1_n, this.mMBlogIntent));

        localTabHost.addTab(buildTabSpec("message_tab", R.string.main_news,
                R.drawable.icon_2_n, this.mInfoIntent));

        localTabHost.addTab(buildTabSpec("userinfo_tab", R.string.main_my_info,
                R.drawable.icon_3_n, this.mUserInfoIntent));

        localTabHost.addTab(buildTabSpec("search_tab", R.string.menu_search,
                R.drawable.icon_4_n, this.mSearchIntent));

        localTabHost.addTab(buildTabSpec("more_tab", R.string.more,
                R.drawable.icon_5_n, this.mMoreIntent));

    }

    private TabHost.TabSpec buildTabSpec(String tag, int resLabel, int resIcon,
            final Intent content) {
        return this.mHost
                .newTabSpec(tag)
                .setIndicator(getString(resLabel),
                        getResources().getDrawable(resIcon))
                .setContent(content);
    }
 

    代码说明

      1.  由于TabWidget被隐藏,所以相关的事件也会无效,这里取巧用RadioGroup与RadioButton的特性来处理切换,然后监听事件调用setCurrentTabByTag来切换Activity。

      2.  注意即使TabWidget被隐藏,也要为其设置indicator,否则会保持。

 

  三、总结

     在这之前如果要做这种效果我恐怕第一时间就会想到用ActivityGroup来做,主要是因为TabHost的TabWidget非常难看,用起 来也不方便。其实从源码可以看出,TabActivity也是继承自ActivityGroup,这里结合了单选按钮和TabHost,各取其长,有时间 可以专门写一个这样的自定义控件:)

 

  四、相关文章

    [Android]使用ActivityGroup来切换Activity和Layout

 

结束

   本文中使用的资源均反编译自apk文件,这里主要是讲思路,欢迎大家交流。

分享到:
评论
3 楼 yuanzhifei89 2011-04-11  
很不错
2 楼 binggo2011 2011-03-11  
不错,学习了..
1 楼 cson_hp 2011-03-08  
楼主很细心啊,可以交流下吗?我的qq是三一三三三久一零八

相关推荐

    新浪微博布局学习——妙用TabHost.zip

    在“新浪微博布局学习——妙用TabHost.doc”文档中,可能详细介绍了如何配置和使用TabHost,包括如何自定义标签样式、处理点击事件、以及如何与其他组件如ViewPager结合等。通过学习这份资料,开发者可以深入理解...

    (框架)Android例子源码——tabhost+activity+slidingMenu仿新浪微博布局.zip

    该压缩包文件是一个Android开发的学习资源,主要展示了如何使用TabHost、Activity以及SlidingMenu来构建一个类似新浪微博的用户界面。下面将详细解释这些技术及其在Android应用开发中的作用。 **TabHost**: TabHost...

    tabhost activity slidingMenu仿新浪微博布局.zip

    在Android开发中,"tabhost activity slidingMenu仿新浪微博布局.zip"是一个典型的移动应用界面设计案例,它结合了TabHost和SlidingMenu组件来模仿新浪微博的用户界面。这个小框架展示了如何构建一个具有底部标签...

    安卓Android源码——ViewPager和Tabhost结合,可滑动的tabhost.rar

    这个压缩包"安卓Android源码——ViewPager和Tabhost结合,可滑动的tabhost.rar"提供了将两者结合使用的示例代码,帮助开发者创建一个可以滑动的`TabHost`,增强用户体验。 `ViewPager` 是Android SDK中的一个强大...

    安卓Android源码——ViewPager和Tabhost结合,可滑动的tabhost.zip

    使用`TabHost.newTabSpec()`创建`TabSpec`,并用`setIndicator()`设置标签文字,用`setContent()`设置与标签对应的`ViewPager`的页码。 4. **绑定`TabSpec`和`ViewPager`**:为了将`TabHost`的点击事件映射到`...

    Android例子源码tabhost+activity+slidingMenu仿新浪微博布局.zip

    本示例源码"Android例子源码tabhost+activity+slidingMenu仿新浪微博布局.zip"提供了一个具体的实践,模仿了流行的社交媒体应用——新浪微博的布局设计。下面我们将深入探讨这些关键组件以及它们如何协同工作。 **...

    安卓Andriod源码——ViewPager和Tabhost结合,可滑动的tabhost.zip

    这个压缩包"安卓Andriod源码——ViewPager和Tabhost结合,可滑动的tabhost.zip"显然是一个示例项目,展示了如何将两者结合,创建一个可滑动的TabHost,提升用户体验。下面我们将详细讨论这两个组件以及它们的结合...

    仿新浪微博 的Tabhost

    在本示例中,"仿新浪微博的Tabhost"是为了实现一个与新浪微博类似的用户界面,其中包含多个功能模块,每个模块对应一个Tab。这个设计可以使用户在不同的功能之间轻松切换,提升用户体验。 Tabhost主要由两部分组成...

    仿新浪微博TabHost菜单

    在Android应用开发中,"仿新浪微博TabHost菜单"是一个常见的设计模式,用于实现类似新浪微博那样具有多标签切换功能的界面。TabHost是Android SDK提供的一种布局管理器,它允许开发者在一个Activity中创建多个Tab,...

    仿新浪微博底部TabHost简单实现

    本教程将详细讲解如何使用TabHost来实现类似新浪微博底部导航栏的效果。 首先,我们需要理解TabHost的基本结构。TabHost通常包含两个主要组件:TabWidget和FrameLayout。TabWidget是展示各个标签的视图,而...

    安卓-新浪微博的tabhost

    总之,“安卓-新浪微博的tabhost”项目展示了如何在Android应用中使用TabHost组件实现类似新浪微博的多选项卡界面。理解并掌握这些技术对于Android开发者来说至关重要,因为TabHost是构建多视图应用的常用工具。通过...

    仿新浪微博tabhost实现

    本教程将详细讲解如何使用TabHost来实现类似新浪微博的应用界面,以供开发者参考。 首先,我们需要了解TabHost的基本结构。TabHost包含两个主要部分:TabWidget和FrameLayout。TabWidget是显示标签的部分,而...

    TabHost实现新浪微博菜单界面

    为了实现类似新浪微博的菜单界面,我们可能需要为每个标签页创建单独的布局文件,或者使用Fragment来管理每个页面的内容。例如,我们可以创建一个`MainActivity`,然后为“首页”、“消息”、“发现”和“我”这四个...

    安卓Android源码——嵌套TabHost示例.zip

    这个示例"安卓Android源码——嵌套TabHost示例.zip"提供了一个关于如何使用`TabHost`进行嵌套布局的实践案例。下面,我们将深入探讨`TabHost`的概念、工作原理以及如何实现嵌套`TabHost`。 `TabHost`是Android SDK...

    RadioGroup实现仿新浪微博的效果

    TabHost可以与RadioGroup结合使用,当用户在RadioGroup中切换选项时,TabHost会显示对应的标签页内容。 总结一下,实现“RadioGroup仿新浪微博效果”主要包括以下步骤: 1. 创建RadioGroup并添加RadioButton子项。 ...

    新浪微博源码

    总的来说,这个【新浪微博源码】项目涵盖了Android开发中的一些核心概念和技术,包括自定义组件(RadioGroup替代TabHost)、用户交互处理(CheckBox逻辑)、数据验证(正则表达式)以及文本格式化(Span的使用)。...

    Android 仿新浪微博TabBar

    总的来说,实现一个Android版的新浪微博TabBar需要结合`TabHost`、`RadioButton`以及自定义布局和事件处理,从而创建出具有下拉菜单效果的多视图导航。通过熟练掌握这些知识点,开发者能够构建出更加丰富和交互性强...

Global site tag (gtag.js) - Google Analytics