`
kevinlynx
  • 浏览: 82250 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Android: Tab的使用总结

阅读更多
之前在t.sina.com.cn/kevinlynx陆续贴了些android开发涉及到的一些code snippets,主要目的是记录,供以后需要的时候查阅方便。但是因为miniblog的字数限制,在记录较多信息的时候还是有诸多不便。so, i'm here.

Tab view算是我接触android平台第二个比较迷惑的地方(第一个是ListView的adapter)。在百度了一些别人的使用心得/总结后,依然发现对tab view的使用存在很多疑问。包括ApiDemo里的例子以及其他一些例子代码。就目前而言我依然存在部分疑点,不过,就单纯的使用而言,倒是足够了。

Tab view通过TabHost来管理tab page:
A TabHost is(copyed from official reference):
Container for a tabbed window view. This object holds two children: a set of tab labels that the user clicks to select a specific tab, and a FrameLayout object that displays the contents of that page.

使用TabHost必然涉及到TabActivity:
class TabSample extends TabActivity {
    protected void onCreate( Bundle savedInstanceState ) {
         TabHost tabHost = getTabHost();
    }
};

取得TabHost 更多地是为tab添加page,即标签页。

此外,android用TabSpec来表示一个标签页,可以通过tabHost.newTabSpec来创建,创建的时候一般会立即设置各种属性,如下代码:

        tabHost.addTab(tabHost.newTabSpec("tab1")
                .setIndicator("tab1")
                .setContent(R.id.view1));



添加标签页的方式就多了,方式太多正是迷惑人的地方。就我目前所查阅的资料来看,有3个方式添加子标签(添加子标签即为tab setContent):

1、如ApiDemo Tabs1.java所示,使用layout (declared in xml)来作为内容

LayoutInflater.from(this).inflate(R.layout.tabs1, tabHost.getTabContentView(), true);

        tabHost.addTab(tabHost.newTabSpec("tab1")
                .setIndicator("tab1")
                .setContent(R.id.view1));

这里的inflate实际上我不太理解,好像是将tabs1这个layout实力化为java对象,并作为tabHost.getTabContentView()的子views。inflat相关机制还没去研究。

2、如ApiDemo Tabs2.java所示,使用TabHost.TabContentFactory来设置标签页的内容:

public class Tabs2 extends TabActivity implements TabHost.TabContentFactory {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final TabHost tabHost = getTabHost();
        tabHost.addTab(tabHost.newTabSpec("tab1")
                .setIndicator("tab1", getResources().getDrawable(R.drawable.star_big_on))
                .setContent(this));
            ....
 public View createTabContent(String tag) {
        final TextView tv = new TextView(this);
        tv.setText("Content for tab with tag " + tag);
        return tv;
    }


3、我想这才是我目前所需要的方式,直接嵌入其他的Activity进来。通过Intent的方式,如ApiDemo Tabs3.java所示:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final TabHost tabHost = getTabHost();

        tabHost.addTab(tabHost.newTabSpec("tab1")
                .setIndicator("list")
                .setContent(new Intent(this, List1.class)));
         ....



以上几种方式中,只有方式1需要使用一个layout(我的意思是xml配置的)。在我查看的另一份代码中(UROP1,一个闹钟程序),他使用了第三种方式,但却在开头setContentView。在我注释掉这行代码时,效果依然没变。包括在网上的很多其他文章,都会使用setContentView,但看起来有点多余。这也是让我迷惑的地方。

综合来说,三种方式,都不需要setContentView,方式1需要inflat一份layout,其他2种则不需要。

BTW,Javaeye的blog编辑功能还不错。:D

1.2.2011 update

默认设置下,TabActivity中的content是activity的话,第一次切换会触发onCreate,切换标签页
不会导致当前activity onStop/onDestroy,只有当退出TabActivity时,才触发。

标签页切换会导致子activity onPause,只有当前处于前台的activity,才会接收到
onBackPressed,整个TabActivity退出时,只会触发一次finishedFromChild。
分享到:
评论
1 楼 jowett 2011-08-12  
尝试了一把,不使用tabhost,单独使用LayoutInflater.from(this).inflate(R.layout.xx, learlayout, true);
可以把layout.xx的内容作为learlayout的child,并显示出来。也就是说这个函数其实和tabhost的实现没有什么具体的关系。

实际上使用了
LayoutInflater.from(this).inflate(R.layout.tabs1, tabHost.getTabContentView(), true); 
以后,相当于把tabs1下面所有的内容放在tabWidget下面作为child,但是因为默认第一个tab页会被set focus,所以页面马上又变为tab1所指向的第一个View1了

相关推荐

    android Tab类型切换界面

    Android中Tab类型界面总结。 viewpager + fragment + fragmentPagerAdpater + PagerTitleStrip

    Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager

    代码为博客的示例代码:http://blog.csdn.net/lmj623565791/article/details/24740977 有问题博客中留言

    Tab的多种典型用法总结(带动画)

    里面包括了五六种tab的用法,包括最简的tab实现方法,RadioGroup实现方法,GridView实现方法,RadioGroup+ViewFlipper实现方法,最后还有一个综合实现在顶部和底部都有tab的例子。希望大家能从中学到些,如果有好的...

    Android ViewPager 的使用总结

    在一个窗口里面添加tab便签,完成便签切换来实现页面的切换,这样的好处是可以在同一个窗口里面有多个页面,这些页面共享同一个窗口的资源,同使用多个窗口来实现这个功能来得更加流畅!! 主要产生的类文件有...

    Android中TabHost选项卡框架

    此项目中总结了Android开发实战项目中常要用到的选项卡功能块

    android开发资料大全

    最无私的Android资料(书籍+代码)分享[总结] Android中文帮助教程(非常合适新手入门) android程序编写及调试新手入门 大家一起学Android(Windows篇) android入门与提高必看指南 Android入门逆引手册 Android...

    Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)

    Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结。目前写了: 1、传统的ViewPager实现 2、FragmentManager+Fragment实现 3、ViewPager+FragmentPagerAdapter实现 4、...

    实例讲解Android应用开发中TabHost的使用要点

    Tab与TabHost: 这就是Tab,而盛放Tab的容器就是TabHost 。 如何实现?? 每一个Tab还对应了一个布局,这个就有点好玩了。...import android.app.TabActivity; public class MyTab extends TabActivity {

    Android聊天项目D3Xmpp.zip

    使用fragments包住四个TAB页面MapActivity—- 地图页. 从聊天页的位置跳到此页面。必须参数lat,lonMyRoomActivity—- 我的群组页NewFriendActivity—- 我的新好友申请页PicSrcPickerActivity—- 弹出选择选图方式。...

    Android_launcher源码全面分析

    3 Tab变化时执行onTabChanged 41 八 AllApp界面拖拽元素 42 1 触摸拦截 43 2 handleTouchEvent方法 43 4 拖曳按钮 44 九 Launcher启动APP流程 45 1 WorkSpace触摸 45 2 CellLayout的onInterceptTouchEvent 方法 46 ...

    Android学习系列教程实例.pdf

    Android 学习文档总结 ................... 1 DevDiv 推荐资源 ........................ 2 Windows 8 ........................................................... 2 iOS .........................................

    ActionBarUseDemo:一个 ActionBar 使用演示

    ActionBarUseDemo总结了Actionbar的基础使用方法:1.在Actionbar添加menuitem,搜索、分享和其他普通item2.Actionbar的导航功能,通过配置manifest和代码实现3.添加Tab页(已过时)4.添加自定义的按钮,类似微信选择...

    Android 活动条ActionBar的详解及实例代码

    Android 活动条ActionBar的详解 图一 图二 图三 ...图三使用ActionBar实现Tab导航 创建ActionBar实现Tab导航步骤 MainActivity代码 DummyFragmentjava代码 图四Android 30之前的Fragment

    githubpopular-reactnative:我的第一个应用程式

    以下是自己RN项目,总结的一些笔记:1.webstorm新建RN项目时,如果运行android无法正常安装项目,则先用AS打开Android项目,自动build对应的gradle版本后,就可以正常运行安装了2.可能需要用到的react-native第三...

    sesvc.exe 阿萨德

    Android HTML5 CSS3 Linux C++ Python C# Node.Js 一文让你彻底理解 Java HashMap 和 ConcurrentHashMap 2018-07-25 分类:JAVA开发、编程开发、首页精华0人评论 来源:crossoverjie.top 分享到:更...

Global site tag (gtag.js) - Google Analytics