FragmentTabHost使用遇到的問(wèn)題

本文記錄一下在使用fragmentTabHost的時(shí)候所遇到的問(wèn)題。
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)聽(tīng)事件,再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再處理邏輯了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容