Android应用开发笔记——打造自己的标签栏

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

今年暑假我和一群朋友参加了某金融软件开发比赛。我们团队打算制定一个基于条形码的移动支付解决方案(点子诞生于5月份的一天,后来我们发现想做的东西已经有了——Google Wallet。囧),软件系统为C/S架构,我负责手机客户端部分。考虑到开放性和技术门槛我们选择了Android平台。

虽然以前也写过一点Android程序,但绝大多数都是所谓的“玩具”,没什么实质性用途。因此,这些玩具们无不例外地拥有着极其简陋的界面。几乎所有的控件都是原生态,纯纯的Android~

两年前,当Android刚出道不久,当各种入门书籍还在漫天飞舞的时候,一款软件穿着原生控件走出去还稍显神气,毕竟那时成型的应用很少。但是,两年后,在这个绿色机器人摧城拔寨之时,如果一款Android应用没有好用、漂亮的UI,你都不好意思说自己在做Android 应用开发。我觉得如果不在原有控件的基础上做一定的拓展,想要写出优美的界面是难以想象的。

我们团队的软件很大程度上参考了Twitter,淘宝一类的客户端。我们想在屏幕底部弄一个标签栏(Tabs),这样用户就可以很方便地在不同的页面间切换了。

作为Android新手,我当时只知道一种方法:

使用Android自带的TabHost容器。

传统的TabHost的使用效果大概是这样的(左图):

这是大众点评网早期的Android客户端,标签栏使用了系统自带的控件。然而这个效果和我们看到的很多底部标签栏相差甚远(右图,twitter客户端Twidroyd截图)。

他们到底是怎么实现的呢?为此,我在网上查了不少资料,大致有以下种方案:

1.Button Bar实现;

2.修改TabWidget。

1. Button Bar

基本思路:用一个Layout来呈现整个标签栏,在上面添加若干按钮作为标签,整个Layout 作为一个部件include到各个界面的布局里去。当用户点击按钮时,切换到相应的界面(多个Activity间的切换)。

在Android 3.0以前的版本里,这种方案多用于制作动作栏。3.0后出现了ActionBar控件,为开发者省了不少事。希望手机版的Android也早点加入。

优点:实现了你想要的效果,外观很容易定制。

缺点:标签栏实际不是一个,有多个,他们分别属于不同的界面(从属关系)。这导致了在界面切换的时候,标签栏会随着他的界面(或者说Activity )“动”,而非常驻在底部。 改进:有一种改进方式是,用一个Activity 来控制整个主界面,标签栏include 在这个主界面的布局里,点击标签时显示相应的View (实际上是在一个Activity 上多个View 的切换)。这样就保证了标签栏只有一个,而且不会随着标签切换而动来动去。当然,缺点也是显而易见的,当标签过多的时候,这个Activity 会变得相当复杂。呵呵~万一有个变动,你懂的。

2. 修改TabWidget

基本思路:在于既然Android 是开源的,我们就能大改特该,让它听话。我们把TabWidget 移到底部,然后修改它的外观。

优点:达到了目的,继承了TabWidget 的基本功能,可复用,使用简单;

缺点:需要研究不少Android 资料,查references 查到眼花,费九牛二虎之力去掉分割线,底部白线之类的东西,完成外观定制。

这个方法貌似有不少人用,这里有几篇中文资料(其实都差不多啦,中文圈你抄我我抄你的。。。唉): /bbs/thread-102-1-4.html /myjava/android-tabwidget.html

3. 奇技淫巧

如你所见,前面说过的方法都能达到目的。但是,Button Bar 的方式看上去太dirty 了,修改TabWidget 又太麻烦了。有什么方式能避免这些不必要的麻烦,把两者优点结合起来呢?

我想到了Android 控件的一个属性: android:visibility=”gone”。这简直就是救命稻草!它可以让你的控件不显示,而且还不占地方。这有什么用呢?这意味着,我们可以照样用TabHost ,可以照样放TabWidget ,只是,只是我们不把TabWidget 显示出来。它现在是隐形的标签栏,the real tabs 。我们所要做的是:安置一个“傀儡”标签栏,让它来和用户接触。这是不是有点像Design Pattern 里的“Proxy”呢?

这个方案算是投机取巧之作,很可惜,我不是第一个想到的,你可以看这里。历史总是惊人的相似啊!

标签容器布局,大致代码如下:

main.xml:

1 2

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

xmlns:android="/apk/res/android " android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:id="@android:id/tabhost">

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:id="@android:id/tabs"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:visibility="gone" />

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

android:layout_width="fill_parent"

android:layout_height="0.0dip"

android:layout_weight="1.0"/>

android:id="@+id/tab_group"

android:layout_width="fill_parent"

android:layout_height="50dp"

android:gravity="center_vertical"

android:layout_gravity="bottom"

android:orientation="horizontal"

android:background="@drawable/tab_bar_bg"

android:checkedButton="@+id/tab1">

android:id="@id/tab1"

相关文档
最新文档