智能移动设备的操作会受限于屏幕的尺寸。一些有关GUI优化技巧不提倡在单独的Activity中显示过多的元素,比较简单的解决办法是将其拆分成多个Activities,每个部分都单独调用。尽管这样解决了表面问题,但是却出现了额外的麻烦,尤其是针对某些内聚属性较高的操作,这样会降低操作的流畅性。
这里介绍一种比较“温馨”的解决方法,应用Widget.TabHost将多个Activities合并成一个Activity,这样就可以同时解决两个问题:
1) 避免单一Activity包含过多元素而过于臃肿,
2) 而且也解决了将复杂的Activities拆分后,降低了拆分“强内聚”而影响到系统的整体性。
对于有经验的朋友会非常容易了解下边例子中包含的方法所代表的作用,那么对于刚刚接触人可以将TabHost理解成类似于浏览器中用来索引不同页面的Tab标签,接下来分析实际的例子。
定义layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- androidres.com -->
<TabHost
android:id="@+id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="105px"/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingTop="65px">
<LinearLayout
android:id="@+id/tab1content"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#00008B">
<!-- Put Tab 1 Views in here -->
</LinearLayout>
<LinearLayout
android:id="@+id/tab2content"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFF00">
<!-- Put Tab 2 Views in here -->
</LinearLayout>
</FrameLayout>
</TabHost>
</LinearLayout>
例子中的LinearLayout作为每个独立标签(TabHost.TabSec)所包含的内容:
1.tabSec.setContent(R.id.tab1content);
同时也可以直接将Intent实体作为参数,这样可以将外部的Activity类作为当前类实体的一部分:
1.tabSec.setContent(new Intent(this, Tab1Activity.class)));
下边分别是两种用于主程序中初始化TabHost的方法,请根据实际的需要选择恰当的处理方式:
1)应用TabSpec分割Activity内部Layout元素(对应于上边的Layout实例):
TabHost tabs = (TabHost)this.findViewById(R.id.tabhost);
tabs.setup();
TabHost.TabSpec one = tabs.newTabSpec("one");
one.setContent(R.id.tab1content);
one.setIndicator("TAB 1");
tabs.addTab(one);
2)将多个Activity类整合到同一个Activity中:
TabHost host = getTabHost();
host.addTab(host.newTabSpec("one").setIndicator("TAB1").setContent(new Intent(this, Tab1Activity.class)));
host.addTab(host.newTabSpec("two").setIndicator("TAB2").setContent(new Intent(this, Tab2Activity.class)));
其中的Tab1Activity和Tab2Activity分别是两个独立的Activity类,上边的例子中所声明的实体将被植入TabSpec中。
tabHost = getTabHost();
String id = this.getIntent().getExtras().getString("CustomerID");
Intent icustom = new Intent(this, fm_Custom_Info.class);
icustom.putExtra("CustomerID", id);
Intent iInterview = new Intent(this, fm_Custom_Interview.class);
iInterview.putExtra("CustomerID", id);
Intent icusExtends = new Intent(this, fm_Custom_Extends.class);
icusExtends.putExtra("CustomerID", id);
LayoutInflater.from(this).inflate(R.layout.fm_custom_page,
tabHost.getTabContentView(), true);
tabHost.addTab(tabHost.newTabSpec("TabC_1").setIndicator("第一个")
.setContent(icustom));
tabHost.addTab(tabHost.newTabSpec("TabC_2").setIndicator("第二个")
.setContent(iInterview));
tabHost.addTab(tabHost.newTabSpec("TabC_3").setIndicator("第三个")
.setContent(icusExtends));