本文記錄一下在使用fragmentTabHost的時(shí)候所遇到的問題。
1:原生的fragmenttabhost在切換tab的時(shí)候,會(huì)導(dǎo)致fragment的重新建立
private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
.......省略部分代碼
if (mLastTab != newTab) {
if (ft == null) {
ft = mFragmentManager.beginTransaction();
}
if (mLastTab != null) {
if (mLastTab.fragment != null) {
ft.detach(mLastTab.fragment);
}
}
if (newTab != null) {
if (newTab.fragment == null) {
newTab.fragment = Fragment.instantiate(mContext,
newTab.clss.getName(), newTab.args);
ft.add(mContainerId, newTab.fragment, newTab.tag);
} else {
ft.attach(newTab.fragment);
}
}
mLastTab = newTab;
}
return ft;
}
很清楚的看到在切換的時(shí)候上個(gè)fragment調(diào)用detach,新的fragment調(diào)用的是attach,所以會(huì)導(dǎo)致重新初始化。
解決辦法:就是把源碼復(fù)雜一份,修改這個(gè)部分代碼就可以解決了。
if (mLastTab != null) {
if (mLastTab.fragment != null) {
ft.hide(mLastTab.fragment); //detach改為hide
}
}
if (newTab.fragment == null) {
newTab.fragment = Fragment.instantiate(mContext,
newTab.clss.getName(), newTab.args);
ft.add(mContainerId, newTab.fragment, newTab.tag);
} else {
ft.show(newTab.fragment); //attach改為show
}
2:就是有時(shí)候的要求是當(dāng)點(diǎn)擊其中一個(gè)tab的時(shí)候不導(dǎo)致fragment的切換,而是做一些其他的操作。
解決辦法:就是基礎(chǔ)fragementtabhost記錄不切換的標(biāo)記,當(dāng)切換的時(shí)候判斷一下就可以。
public class NoTabFragmentTabHost extends FragmentTabHost {
private String mCurrentTag;
private String mNoTabChangedTag;
public NoTabFragmentTabHost(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onTabChanged(String tag) {
if (tag.equals(mNoTabChangedTag)) {
setCurrentTabByTag(mCurrentTag);
} else {
super.onTabChanged(tag);
mCurrentTag = tag;
}
}
public void setNoTabChangedTag(String tag) {
this.mNoTabChangedTag = tag;
}
}
3:還有一些app當(dāng)再次點(diǎn)擊當(dāng)前tab的時(shí)候會(huì)去刷新操作。
解決辦法:當(dāng)你初始化的時(shí)候
mTabHost.getTabWidget().getChildAt(i).setOnTouchListener(this);
給每個(gè)的tabwidget的子view設(shè)置監(jiān)聽事件,再onTouch的處理
boolean consumed = false;
if (event.getAction() == MotionEvent.ACTION_DOWN
&& v.equals(mTabHost.getCurrentTabView())) {
Log.d("再次點(diǎn)擊了", "再次點(diǎn)擊了");
consumed = true;
}
}
return consumed;
在這里你就可以獲取當(dāng)前的fragment再處理邏輯了。