Search code examples
androidandroid-tabhost

TabHost some time the hosted fragment does not show


Having a TabHost with a few tabs. It works most of the time when switching tabs. But sometime when clicking on one tab it does switch to the tab, and in trace it did call the

ft.show(newTab.fragment);

but the fragment content does not show.

Noticed (i.e. it has three tabs), the first tab, which is default one to be opened first will always be ok to be tabbed on, but the next 2 would have problem later to be tabbed on.

Anyone noticed similar or any missing something here? Thanks!

in TabHost.OnTabChangeListener

@Override
public void onTabChanged(String tabId) {

    FragmentTransaction ft = mFragmentManager.beginTransaction();
    TabInfo newTab = null;
    for (int i=0; i<mTabs.size(); i++) {
        TabInfo tab = mTabs.get(i);
        if (tab.tag.equals(tabId)) {
            newTab = tab;
            break;
        }
    }

    if (mLastTab != newTab) {
        if (mLastTab != null) {
            if (mLastTab.fragment != null) {
                ft.hide(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 {
                if (newTab.fragment.isHidden()){
                    ft.show(newTab.fragment);
                } else {
                    ft.attach(newTab.fragment);
                }
            }
        }

        mPreviousTab = mLastTab;
        mLastTab = newTab;

        ft.commit();
    }
}

Solution

  • find the problem, the fragment could be hidden and detached as well. In that case needs to create new one.

    change:

    if (newTab.fragment.isHidden()){
                    ft.show(newTab.fragment);
                } else {
                    ft.attach(newTab.fragment);
                }
    

    to:

    if (!newTab.fragment.isDetached() && newTab.fragment.isHidden()){
                        ft.show(newTab.fragment);
                    } else {
                        if (newTab.fragment.isDetached() || !newTab.fragment.isAdded()) {
                            newTab.fragment = Fragment.instantiate(mContext,
                                    newTab.clss.getName(), newTab.args);
                            ft.add(mContainerId, newTab.fragment, newTab.tag);
    
                        } else {
                            ft.attach(newTab.fragment);
                        }
                    }