首页 > 移动开发 > Android > 正文
1.5.1 TabbedActivity类
2015-04-21 15:44:04     我来说两句      
收藏    我要投稿

TabbedActivity类是Activity的抽象子类。这个应用程序框架中的其他Activity子类扩展TabbedActivity,如果继续使用这个框架,添加到这个框架的Activity子类也可能会扩展这个类。
 
作为这个框架的具体类的抽象父类,TabbedActivity为子类提供了一些功能,特别是:

●操作栏中的选项卡可用于选择片段

●使应用程序可以将数据加载到片段中

●抽象用户界面,不论其是在一个大屏幕上,还是在两个较小的屏幕上分开

此抽象类是进行大部分工作的地方,并且也是设计的巧妙之处。InitializeTabs()方法初始化选项卡的名称和连接选项卡到它们所控制的片段。这在活动的onCreate()方法中调用。
 

/**
* Initialize tabs in an activity that uses tabs to switch among fragments
*
* @param defaultIndex
*            The index of the Fragment shown first
* @param nameIDs
*            an array of ID for tab names
* @param fragmentIDs
*            an array of IDs of Fragment resources
*/
public void initializeTabs(int defaultIndex, int[] nameIDs, int[] fragmentIDs) {
      
// How many do we have?
int n = nameIDs.length;
int i = 0;
      
// Find at least one fragment that should implement TabListener
TabListener tlFrag = (TabListener) getFragmentManager()
      .findFragmentById(fragmentIDs[i]);
      
// Null check - harmless to call if there are no such fragments
if (null != tlFrag) {
      
// Get the action bar and remove existing tabs
ActionBar bar = getActionBar();
bar.removeAllTabs();
      
// Make new tabs and assign tags and listeners
for (; i < n; i++) {
tlFrag = (TabListener) 
getFragmentManager().findFragmentById(fragmentIDs[i]);
Tab t = bar.newTab().setText(nameIDs[i]).setTag(tlFrag).
setTabListener(tlFrag);
bar.addTab(t);
}
bar.getTabAt(defaultIndex).select();
}
}

每当用户从屏幕左边的列表中选取一项,就会调用loadTabFragments()方法。它将所选择的数据加载到屏幕右侧片段的视图中。该方法包含该应用程序中唯一需要注意屏幕布局的逻辑。如果活动中包含标签,则调用doLoad()方法。如果没有,将发生有趣的事情—— 启动一个新活动,并且意图(intent)中追加了包含数据的Bundle对象。

尽管这里有一条if语句,用于区分较大屏幕只使用一个活动而较小屏幕使用两个活动,然而没有基于屏幕大小或像素密度进行判断的任何逻辑代码。这是有理由的。你的程序始终会遇到新的屏幕尺寸。根据屏幕参数进行决策的代码,始终容易受新设备的影响。相反,应该让系统做出要使用的布局决策,并确保代码可适应所有可能的选择。
 

/**
* If we have tabs and fragments in this activity, pass the bundle data to
* the fragments. Otherwise start an activity that should contain the
* fragments.
*
* @param data
*/
public void loadTabFragments(Bundle data) {
int n = getActionBar().getTabCount();
if (0 != n) {
doLoad(n, data);
} else {
startActivity(new Intent(this, TabActivity.class).putExtras(data));
}
}
      
/**
* An interface to pass data to a Fragment
*/
public interface SetData {
public void setData(Bundle data);
}
      
/**
* Iterate over the tabs, get their tags, and use these as Fragment
* references to pass the bundle data to the fragments
*
* @param n
* @param data
*/
private void doLoad(int n, Bundle data) {

// Null check - harmless if no data
if (null == data) return;

int i;
ActionBar actionBar = getActionBar();

for (i = 0; i < n; i++) {
SetData f = (SetData) actionBar.getTabAt(i).getTag();
f.setData(data);
}
actionBar.selectTab(actionBar.getTabAt(0));
}
      
      
}

 

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.5 整合Activity、Fragment和Action Bar
下一篇:1.5.2 针对大平板电脑的Main.xml文件
相关文章
图文推荐
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站