Android FragmentTabHost看源码延伸

FragmentTabHost

v4包里面,继承TabHost,实现OnTabChangeListener ,但同时它自己也有一个OnTabChangeListener属性,这个类来源于TabHost,为啥要这样设计呢,是因为这是一个需要暴露给用户使用的,当然,当用户的activity没有主动实现它的时候,就是FragmentTabHost调用自己继承的OnTabChangeListener去做响应操作

public class FragmentTabHost extends TabHost implements OnTabChangeListener

自己继承OnTabChangeListener需要重写onTabChanged()方法,

if(this.mAttached) {
FragmentTransaction ft = this.doTabChanged(tabId, (FragmentTransaction)null);
if(ft != null) {
ft.commit();
}
}

这个函数会调用doTabChanged()方法,这个方法里面的代码就很熟悉了:
根据给的tabId找到对应的Fragment(注意用户的Fragments以及被装载进来了),然后判断这个Fragment和FragmentTabHost的mLastTab所对应的是不是同一个,如果不是且mLastTab对应的Fragment不为null,那么就让FragmentTransaction剥离它。接下来如果newTab对应的Fragment为null,那么创建它并绑定它,创建的时候用的Fragment.instantiate(),很熟悉吧,创建完之后用FragmentTransaction的add添加进去。如果不为null,更省事,直接ft.attach(newTab.fragment);最后 this.mLastTab = newTab;
那么问题来了,newTab为null了为什么还有判断它的Fragment呢,因为它是这样的:

static final class TabInfo {
private final String tag;
private final Class< ?> clss;
private final Bundle args;
private Fragment fragment; TabInfo(String _tag, Class< ?> _class, Bundle _args) {
this.tag = _tag;
this.clss = _class;
this.args = _args;
}
}

既然它这么多属性,肯定都是有用的,那就回到activity层面看看,我们的activity是这样写的

for (int i = 0; i < tabs.length; i++) {
mTabHost.addTab(mTabHost.newTabSpec(tabs[i]).setIndicator(tabs[i]),
cls[i], null);
}
.
.
.
mTabHost.setCurrentTabByTag(tabs[0]);
这个函数其实就是我们源码的入口,它其实是FragmentTabHost父类TabHost的函数,那么就有了下面的流程

TabHost:setCurrentTabByTag –>setCurrentTab–>invokeOnTabChangeListener,
如果在activity里面我们设置了OnTabChangeListener,那么它接下来会–>mOnTabChangeListener.onTabChanged(),如果没有设置,那么就不做任何操作,即invokeOnTabChangeListener为null。

上面说了这个mOnTabChangeListener在TabHost里面是接口的形式,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值