7.5.3 重新定制选项卡

了解了全新的动作栏和界面片段,再来看看它们对交互界面的贡献。前面曾介绍了Android的选项卡控件,在Android 3.0以前的版本中,选项卡控件被广泛使用,用以将同一界面组件内的不同功能区域进行隔离和切换。

使用选项卡控件,需要完全打破界面组件的设计初衷,将界面组件退化成本地界面组件来使用。这就使得界面组件丧失了原有的黑盒特征,并且无法通过意图机制交互数据。

而从Android 3.0版本开始,使用动作栏和界面片段,可以更为自然简单地构建具有选项卡效果的交互界面。如图7-20所示,新的选项卡效果,可以部署在任意的界面组件上,而不只是选项卡组件TabActivity上;所有的标签页统一在动作栏上显示,而不需要使用特殊的选项卡控件TabWidget;而选项卡的内容界面,则可用界面片段取代本地界面组件来实现。使用这样的方式来定制选项卡界面,更为简单、统一且效果更丰富。

7.5.3 重新定制选项卡 - 图1

图 7-20 新老Android版本的标签栏实现比较

构建选项卡的标签页非常简单,只需要调用ActionBar.addTab函数即可:


//派生任意的界面组件,即可实现选项卡界面

public class SimpleTabs extends Activity{

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

//初始化动作栏,将其设置成为选项卡模式

final ActionBar actionBar=getActionBar();

actionBar.setNavigationMode(

ActionBar.NAVIGATION_MODE_TABS);

actionBar.setDisplayOptions(0,

ActionBar.DISPLAY_SHOW_TITLE);

//添加两个选项卡

actionBar.addTab(bar.newTab()

.setText("Page One")

.setTabListener(new PageOneLinstener(this)));

actionBar.addTab(bar.newTab()

.setText("Page Two")

.setTabListener(new PageTwoLinstener(this)));

//默认首选第一个标签页

actionBar.setSelectedNavigationItem(0);

}

}


其中,PageOneLinstener和PageTwoLinstener都是对应标签页的点击监听对象,它们派生自ActionBar.TabListener对象,当用户(或者通过代码设置)切换到对应的标签页时,会触发对应的回调函数。实现者需要重载这些接口,来处理对应的回调事件,控制界面的显示:


public static class PageOneListener implements ActionBar.TabListener{

private final Activity mActivity;

private Fragment mFragment;

public PageOneListener(Activity activity){

mActivity=activity;

}

public void onTabSelected(Tab tab, FragmentTransaction ft){

//当标签页被选中时,回调该函数

//通常可以将界面片段的构造延迟到第一次显示

if(mFragment==null){

mFragment=new OnePageFragment(mActivity);

ft.add(android.R.id.content, mFragment,"One");

}else{

//如果已经显示,可以将界面组件绑定上

ft.attach(mFragment);

}

}

public void onTabUnselected(Tab tab, FragmentTransaction ft){

//当标签页被取消选中时,回调该函数

//通常可以将界面片段解除绑定,而不是销毁

if(mFragment!=null){

ft.detach(mFragment);

}

}

public void onTabReselected(Tab tab, FragmentTransaction ft){

//当标签页在选中的状态再次被选中时,回调该函数

//通常可以什么都不做…

}

}


可以看到,在监听对象ActionBar.TabListener中,可以自行处理选项卡内容呈现,而无需拘泥于传统的选项卡模式,从而可以更为灵活地构建出所需的各种交互效果。