Created
March 13, 2012 10:13
-
-
Save manmal/2027980 to your computer and use it in GitHub Desktop.
Tabmanager for using a TabHost with fragments.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.HashMap; | |
import android.content.Context; | |
import android.os.Bundle; | |
import android.support.v4.app.Fragment; | |
import android.support.v4.app.FragmentActivity; | |
import android.support.v4.app.FragmentTransaction; | |
import android.view.View; | |
import android.widget.TabHost; | |
import android.widget.TabHost.OnTabChangeListener; | |
/** | |
* Don't know anymore where I found that. | |
* ---------------------------------------------- | |
* This is a helper class that implements a generic mechanism for | |
* associating fragments with the tabs in a tab host. It relies on a | |
* trick. Normally a tab host has a simple API for supplying a View or | |
* Intent that each tab will show. This is not sufficient for switching | |
* between fragments. So instead we make the content part of the tab host | |
* 0dp high (it is not shown) and the TabManager supplies its own dummy | |
* view to show as the tab content. It listens to changes in tabs, and takes | |
* care of switch to the correct fragment shown in a separate content area | |
* whenever the selected tab changes. | |
*/ | |
public class TabManager implements TabHost.OnTabChangeListener { | |
private final FragmentActivity mActivity; | |
private final TabHost mTabHost; | |
private final int mContainerId; | |
private final HashMap<String, TabManager.TabInfo> mTabs = new HashMap<String, TabManager.TabInfo>(); | |
TabManager.TabInfo mLastTab; | |
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) { | |
tag = _tag; | |
clss = _class; | |
args = _args; | |
} | |
} | |
static class DummyTabFactory implements TabHost.TabContentFactory { | |
private final Context mContext; | |
public DummyTabFactory(Context context) { | |
mContext = context; | |
} | |
public View createTabContent(String tag) { | |
View v = new View(mContext); | |
v.setMinimumWidth(0); | |
v.setMinimumHeight(0); | |
return v; | |
} | |
} | |
public TabManager(FragmentActivity activity, TabHost tabHost, int containerId) { | |
mActivity = activity; | |
mTabHost = tabHost; | |
mContainerId = containerId; | |
mTabHost.setOnTabChangedListener(this); | |
} | |
public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) { | |
tabSpec.setContent(new DummyTabFactory(mActivity)); | |
String tag = tabSpec.getTag(); | |
TabManager.TabInfo info = new TabInfo(tag, clss, args); | |
// Check to see if we already have a fragment for this tab, probably | |
// from a previously saved state. If so, deactivate it, because our | |
// initial state is that a tab isn't shown. | |
info.fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag); | |
if (info.fragment != null && !info.fragment.isDetached()) { | |
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); | |
ft.detach(info.fragment); | |
ft.commit(); | |
} | |
mTabs.put(tag, info); | |
mTabHost.addTab(tabSpec); | |
} | |
public void onTabChanged(String tabId) { | |
TabManager.TabInfo newTab = mTabs.get(tabId); | |
if (mLastTab != newTab) { | |
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); | |
if (mLastTab != null) { | |
if (mLastTab.fragment != null) { | |
ft.detach(mLastTab.fragment); | |
} | |
} | |
if (newTab != null) { | |
if (newTab.fragment == null) { | |
newTab.fragment = Fragment.instantiate(mActivity, | |
newTab.clss.getName(), newTab.args); | |
ft.add(mContainerId, newTab.fragment, newTab.tag); | |
} else { | |
ft.attach(newTab.fragment); | |
} | |
} | |
mLastTab = newTab; | |
ft.commit(); | |
mActivity.getSupportFragmentManager().executePendingTransactions(); | |
} | |
if (listener != null) listener.onTabChanged(tabId); | |
} | |
private OnTabChangeListener listener; | |
public void setOnTabChangedListener(OnTabChangeListener listener) { | |
this.listener = listener; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment