Voici mon exemple d'une classe d'onglets appelée classe ABTabsAdapter qui présente et gère jusqu'à trois niveaux virtuels de tabulations avec des fragments associés en utilisant un FragmentStatePagerAdapter, ViewPager et ActionBar tous travaillant ensemble avec une collection de tabulations et de fragments "collés" ensemble avec une structure TabInfo. Cette solution est reconstituée à partir d'autres solutions publiées sur StackOverflow et de la documentation d'assistance Android. La clé est d'utiliser FragmentStatePagerAdapter (PAS FragmentPagerAdapter comme indiqué dans l'éclairage Android et tel que présenté dans le modèle de projet Android par défaut). Notez également l'utilisation de la variable bIsSet booléenne qui présente les onglets sélectionnés lors de l'insertion via la fonction addTab. Enfin, sachez que la fonction getItemPosition peut également renvoyer la position réelle de fragment/view/tab, mais cela a peu d'impact sur les performances d'un FragmentStatePagerAdapter et il est plus facile à lire/utiliser quand il renvoie simplement POSITION_NONE pour tous les éléments demandés (this est, en fait, actuellement le moyen suggéré pour mettre à jour ViewPager lorsque les onglets changent de place - dans cette implémentation non seulement les onglets changeront de place, ils seront également supprimés et rajoutés selon le "niveau" contextuel du menu onglets.) (Partie 1)
public class ABTabsAdapter extends FragmentStatePagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener
{
ActionBar.Tab tabLevelHome = null;
ActionBar.Tab tabLevel1_2 = null;
ActionBar.Tab tabLevel1_3 = null;
ActionBar.Tab tabLevel1_4 = null;
ActionBar.Tab tabLevel1_2_1 = null;
ActionBar.Tab tabLevel1_2_2 = null;
ActionBar.Tab tabLevel1_2_3 = null;
ActionBar.Tab tabLevel1_3_1 = null;
ActionBar.Tab tabLevel1_3_1_1 = null;
ActionBar.Tab tabLevel1_3_2 = null;
ActionBar.Tab tabLevel1_3_2_1 = null;
ActionBar.Tab tabLevel1_3_3 = null;
ActionBar.Tab tabLevel1_3_3_1 = null;
ActionBar.Tab tabLevel1_4_1 = null;
ActionBar.Tab tabLevel1_4_2 = null;
TabInfo infoLevelHome = null;
TabInfo infoLevel1_2 = null;
TabInfo infoLevel1_3 = null;
TabInfo infoLevel1_4 = null;
TabInfo infoLevel1_2_1 = null;
TabInfo infoLevel1_2_2 = null;
TabInfo infoLevel1_2_3 = null;
TabInfo infoLevel1_3_1 = null;
TabInfo infoLevel1_3_1_1 = null;
TabInfo infoLevel1_3_2 = null;
TabInfo infoLevel1_3_2_1 = null;
TabInfo infoLevel1_3_3 = null;
TabInfo infoLevel1_3_3_1 = null;
TabInfo infoLevel1_4_1 = null;
TabInfo infoLevel1_4_2 = null;
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
Boolean bIsSet = false;
static final class TabInfo
{
private final Class<?> clss;
TabInfo(Class<?> _class)
{
clss = _class;
}
}
public ABTabsAdapter(HomeActivity homeActivity, FragmentManager fragmentManager, ViewPager viewPager, ActionBar actionBar)
{
super(fragmentManager);
mContext = homeActivity;
mActionBar = actionBar;
mViewPager = viewPager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
initializeTabs();
bIsSet = true;
selectLayout(0);
}
@Override
public int getCount()
{
return mTabs.size();
}
@Override
public Fragment getItem(int nPos)
{
return Fragment.instantiate(mContext, getSelectedTab(nPos).clss.getName(), null);
}
@Override
public int getItemPosition(Object objGet)
{
return POSITION_NONE;
}
@Override
public void onPageScrolled(int nPos, float fOffset, int nOffsetPixels)
{
}
@Override
public void onPageSelected(int nPos)
{
mActionBar.setSelectedNavigationItem(nPos);
}
@Override
public void onPageScrollStateChanged(int nState)
{
}
@Override
public void onTabSelected(ActionBar.Tab tabSelected, FragmentTransaction fragmentTransaction)
{
TabInfo infoGet = (TabInfo)tabSelected.getTag();
selectLayout(tabSelected.getPosition());
for (int nCount=0; nCount < mTabs.size(); nCount++)
{
if (mTabs.get(nCount).clss.getName() == infoGet.clss.getName())
{
mViewPager.setCurrentItem(nCount);
}
}
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
{
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft)
{
}
public void addTab(ActionBar.Tab tabAdd, int nPos)
{
try
{
if(nPos < 0)
{
mTabs.add((TabInfo)tabAdd.getTag());
mActionBar.addTab(tabAdd);
notifyDataSetChanged();
}
else
{
mTabs.add(nPos,(TabInfo)tabAdd.getTag());
mActionBar.addTab(tabAdd, nPos);
notifyDataSetChanged();
}
}
catch(Exception e)
{
appContext.showMessage("Error","[addTab]: "+e.toString());
}
}
public void removeTab(ActionBar.Tab tabRemove)
{
try
{
Object tag = tabRemove.getTag();
for (int nCount=0; nCount < mTabs.size(); nCount++)
{
if (mTabs.get(nCount) == tag)
{
mTabs.remove(nCount);
mActionBar.removeTab(tabRemove);
notifyDataSetChanged();
break;
}
}
}
catch(Exception e)
{
appContext.showMessage("Error","[removeTab]: "+e.toString());
}
}
public void initializeTabs()
{
try
{
tabLevelHome = mActionBar.newTab();
if(tabLevelHome != null)
{
tabLevelHome.setText(" Home");
tabLevelHome.setIcon(R.drawable.levelhome_44x29);
tabLevelHome.setTabListener(this);
infoLevelHome = new TabInfo(HomeActivity.HomeFragment.class);
tabLevelHome.setTag(infoLevelHome);
}
else
appContext.showMessage("Error","[initializeTabs] Home tab is not set.");
tabLevel1_2 = mActionBar.newTab();
if(tabLevel1_2 != null)
{
tabLevel1_2.setText(" Level1_2");
tabLevel1_2.setIcon(R.drawable.level1_2_44x29);
tabLevel1_2.setTabListener(this);
infoLevel1_2 = new TabInfo(Level1_2Fragment.class);
tabLevel1_2.setTag(infoLevel1_2);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_2 tab is not set.");
tabLevel1_3 = mActionBar.newTab();
if(tabLevel1_3 != null)
{
tabLevel1_3.setText(" Level1_3");
tabLevel1_3.setIcon(R.drawable.level1_3_44x29);
tabLevel1_3.setTabListener(this);
infoLevel1_3 = new TabInfo(Level1_3Fragment.class);
tabLevel1_3.setTag(infoLevel1_3);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_3 tab is not set.");
tabLevel1_4 = mActionBar.newTab();
if(tabLevel1_4 != null)
{
tabLevel1_4.setText(" Level1_4");
tabLevel1_4.setIcon(R.drawable.level1_4_44x29);
tabLevel1_4.setTabListener(this);
infoLevel1_4 = new TabInfo(Level1_4Fragment.class);
tabLevel1_4.setTag(infoLevel1_4);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_4 tab is not set.");
tabLevel1_2_1 = mActionBar.newTab();
if(tabLevel1_2_1 != null)
{
tabLevel1_2_1.setText(" Level1_2_1");
tabLevel1_2_1.setIcon(R.drawable.level1_2_1_44x29);
tabLevel1_2_1.setTabListener(this);
infoLevel1_2_1 = new TabInfo(Level1_2_1Fragment.class);
tabLevel1_2_1.setTag(infoLevel1_2_1);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_2_1 tab is not set.");
tabLevel1_2_2 = mActionBar.newTab();
if(tabLevel1_2_2 != null)
{
tabLevel1_2_2.setText(" Level1_2_2");
tabLevel1_2_2.setIcon(R.drawable.level1_2_2_44x29);
tabLevel1_2_2.setTabListener(this);
infoLevel1_2_2 = new TabInfo(Level1_2_2Fragment.class);
tabLevel1_2_2.setTag(infoLevel1_2_2);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_2_2 tab is not set.");
tabLevel1_2_3 = mActionBar.newTab();
if(tabLevel1_2_3 != null)
{
tabLevel1_2_3.setText(" Level1_2_3");
tabLevel1_2_3.setIcon(R.drawable.level1_2_3_44x29);
tabLevel1_2_3.setTabListener(this);
infoLevel1_2_3 = new TabInfo(Level1_2_3Fragment.class);
tabLevel1_2_3.setTag(infoLevel1_2_3);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_2_3 tab is not set.");
tabLevel1_3_1 = mActionBar.newTab();
if(tabLevel1_3_1 != null)
{
tabLevel1_3_1.setText(" Level1_3_1");
tabLevel1_3_1.setIcon(R.drawable.level1_3_1_44x29);
tabLevel1_3_1.setTabListener(this);
infoLevel1_3_1 = new TabInfo(Level1_3_1Fragment.class);
tabLevel1_3_1.setTag(infoLevel1_3_1);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_3_1 tab is not set.");
tabLevel1_3_1_1 = mActionBar.newTab();
if(tabLevel1_3_1_1 != null)
{
tabLevel1_3_1_1.setText(" Level1_3_1_1");
tabLevel1_3_1_1.setIcon(R.drawable.level1_3_1_1_44x29);
tabLevel1_3_1_1.setTabListener(this);
infoLevel1_3_1_1 = new TabInfo(Level1_3_1_1Fragment.class);
tabLevel1_3_1_1.setTag(infoLevel1_3_1_1);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_3_1_1 tab is not set.");
tabLevel1_3_2 = mActionBar.newTab();
if(tabLevel1_3_2 != null)
{
tabLevel1_3_2.setText(" Level1_3_2");
tabLevel1_3_2.setIcon(R.drawable.level1_3_2_44x29);
tabLevel1_3_2.setTabListener(this);
infoLevel1_3_2 = new TabInfo(Level1_3_2Fragment.class);
tabLevel1_3_2.setTag(infoLevel1_3_2);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_3_2 tab is not set.");
tabLevel1_3_2_1 = mActionBar.newTab();
if(tabLevel1_3_2_1 != null)
{
tabLevel1_3_2_1.setText(" Level1_3_2_1");
tabLevel1_3_2_1.setIcon(R.drawable.level1_3_2_1_44x29);
tabLevel1_3_2_1.setTabListener(this);
infoLevel1_3_2_1 = new TabInfo(Level1_3_2_1Fragment.class);
tabLevel1_3_2_1.setTag(infoLevel1_3_2_1);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_3_2_1 tab is not set.");
tabLevel1_3_3 = mActionBar.newTab();
if(tabLevel1_3_3 != null)
{
tabLevel1_3_3.setText(" Level1_3_3");
tabLevel1_3_3.setIcon(R.drawable.level1_3_3_44x29);
tabLevel1_3_3.setTabListener(this);
infoLevel1_3_3 = new TabInfo(Level1_3_3Fragment.class);
tabLevel1_3_3.setTag(infoLevel1_3_3);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_3_3 tab is not set.");
tabLevel1_3_3_1 = mActionBar.newTab();
if(tabLevel1_3_3_1 != null)
{
tabLevel1_3_3_1.setText(" Level1_3_3_1");
tabLevel1_3_3_1.setIcon(R.drawable.level1_3_3_1_44x29);
tabLevel1_3_3_1.setTabListener(this);
infoLevel1_3_3_1 = new TabInfo(Level1_3_3_1Fragment.class);
tabLevel1_3_3_1.setTag(infoLevel1_3_3_1);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_3_3_1 tab is not set.");
tabLevel1_4_1 = mActionBar.newTab();
if(tabLevel1_4_1 != null)
{
tabLevel1_4_1.setText(" Level1_4_1");
tabLevel1_4_1.setIcon(R.drawable.level1_4_1_44x29);
tabLevel1_4_1.setTabListener(this);
infoLevel1_4_1 = new TabInfo(Level1_4_1Fragment.class);
tabLevel1_4_1.setTag(infoLevel1_4_1);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_4_1 tab is not set.");
tabLevel1_4_2 = mActionBar.newTab();
if(tabLevel1_4_2 != null)
{
tabLevel1_4_2.setText(" Level1_4_2");
tabLevel1_4_2.setIcon(R.drawable.level1_4_2_44x29);
tabLevel1_4_2.setTabListener(this);
infoLevel1_4_2 = new TabInfo(Level1_4_2Fragment.class);
tabLevel1_4_2.setTag(infoLevel1_4_2);
}
else
appContext.showMessage("Error","[initializeTabs] Level1_4_2 tab is not set.");
}
catch(Exception e)
{
appContext.showMessage("Error","[initializeTabs]: "+e.toString());
}
}
public void selectLayout(int nPos)
{
try
{
if(bIsSet)
{
bIsSet = false;
if(appContext.nCurrentLayoutID == 0)
showLayoutHome();
else if(appContext.nCurrentLayoutID == R.layout.fragment_levelhome)
{
if(nPos == 0)
appContext.nCurrentLayoutID = R.layout.fragment_levelhome;
else if(nPos == 1)
showLayoutLevel1_2();
else if(nPos == 2)
showLayoutLevel1_3();
else if(nPos == 3)
showLayoutLevel1_4();
}
else if(appContext.nCurrentLayoutID == R.layout.fragment_level1_2)
{
if(nPos == 0)
showLayoutHome();
else if(nPos == 1)
appContext.nCurrentLayoutID = R.layout.fragment_level1_2;
else if(nPos == 2)
showLayoutLevel1_2_1();
else if(nPos == 3)
appContext.nCurrentLayoutID = R.layout.fragment_level1_4_2;
}
else if(appContext.nCurrentLayoutID == R.layout.fragment_level1_3)
{
if (nPos == 0)
showLayoutHome();
else if (nPos == 1)
appContext.nCurrentLayoutID = R.layout.fragment_level1_3;
else if (nPos == 2)
showLayoutLevel1_3_1();
else if (nPos == 3)
showLayoutLevel1_3_2();
else if (nPos == 4)
showLayoutLevel1_3_3();
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_4) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_4_1))
{
if (nPos == 0)
showLayoutHome();
else if(nPos == 1)
appContext.nCurrentLayoutID = R.layout.fragment_level1_4;
else if(nPos == 2)
appContext.nCurrentLayoutID = R.layout.fragment_level1_4_1;
else if(nPos == 3)
appContext.nCurrentLayoutID = R.layout.fragment_level1_4_2;
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_3_1) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_3_1_1))
{
if (nPos == 0)
showLayoutLevel1_3();
else if(nPos == 1)
appContext.nCurrentLayoutID = R.layout.fragment_level1_3_1;
else if(nPos == 2)
appContext.nCurrentLayoutID = R.layout.fragment_level1_3_1_1;
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_3_2) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_3_2_1))
{
if (nPos == 0)
showLayoutLevel1_3();
else if(nPos == 1)
appContext.nCurrentLayoutID = R.layout.fragment_level1_3_2;
else if(nPos == 2)
appContext.nCurrentLayoutID = R.layout.fragment_level1_3_2_1;
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_3_3) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_3_3_1))
{
if (nPos == 0)
showLayoutLevel1_3();
else if(nPos == 1)
appContext.nCurrentLayoutID = R.layout.fragment_level1_3_3;
else if(nPos == 2)
appContext.nCurrentLayoutID = R.layout.fragment_level1_3_3_1;
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_2_1) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_2_2) ||(appContext.nCurrentLayoutID == R.layout.fragment_level1_2_3))
{
if (nPos == 0)
showLayoutLevel1_2();
else if(nPos == 1)
appContext.nCurrentLayoutID = R.layout.fragment_level1_2_1;
else if(nPos == 2)
appContext.nCurrentLayoutID = R.layout.fragment_level1_2_2;
else if(nPos == 3)
appContext.nCurrentLayoutID = R.layout.fragment_level1_2_3;
}
else if(appContext.nCurrentLayoutID == R.layout.fragment_level1_4_2)
{
if(mActionBar.getTabAt(1).getText() == " Level1_2")
{
if(nPos == 0)
showLayoutHome();
else if(nPos == 1)
appContext.nCurrentLayoutID = R.layout.fragment_level1_2;
else if(nPos == 2)
showLayoutLevel1_2_1();
else if(nPos == 3)
appContext.nCurrentLayoutID = R.layout.fragment_level1_4_2;
}
else
{
if (nPos == 0)
showLayoutHome();
else if(nPos == 1)
appContext.nCurrentLayoutID = R.layout.fragment_level1_4;
else if(nPos == 2)
appContext.nCurrentLayoutID = R.layout.fragment_level1_4_1;
else if(nPos == 3)
appContext.nCurrentLayoutID = R.layout.fragment_level1_4_2;
}
}
updateActionBar();
bIsSet = true;
}
}
catch(Exception e)
{
appContext.showMessage("Error","[selectLayout]: "+e.toString());
}
}
public TabInfo getSelectedTab(int nPos)
{
TabInfo infoGet = null;
try
{
if(appContext.nCurrentLayoutID == 0)
infoGet = (TabInfo)tabLevelHome.getTag();
else if(appContext.nCurrentLayoutID == R.layout.fragment_levelhome)
{
if(nPos == 0)
infoGet = (TabInfo)tabLevelHome.getTag();
else if(nPos == 1)
infoGet = (TabInfo)tabLevel1_2.getTag();
else if(nPos == 2)
infoGet = (TabInfo)tabLevel1_3.getTag();
else if(nPos == 3)
infoGet = (TabInfo)tabLevel1_4.getTag();
}
else if(appContext.nCurrentLayoutID == R.layout.fragment_level1_2)
{
if(nPos == 0)
infoGet = (TabInfo)tabLevelHome.getTag();
else if(nPos == 1)
infoGet = (TabInfo)tabLevel1_2.getTag();
else if(nPos == 2)
infoGet = (TabInfo)tabLevel1_2_1.getTag();
else if(nPos == 3)
infoGet = (TabInfo)tabLevel1_4_2.getTag();
}
else if(appContext.nCurrentLayoutID == R.layout.fragment_level1_3)
{
if (nPos == 0)
infoGet = (TabInfo)tabLevelHome.getTag();
else if (nPos == 1)
infoGet = (TabInfo)tabLevel1_3.getTag();
else if (nPos == 2)
infoGet = (TabInfo)tabLevel1_3_1.getTag();
else if (nPos == 3)
infoGet = (TabInfo)tabLevel1_3_2.getTag();
else if (nPos == 4)
infoGet = (TabInfo)tabLevel1_3_3.getTag();
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_4) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_4_1))
{
if (nPos == 0)
infoGet = (TabInfo)tabLevelHome.getTag();
else if(nPos == 1)
infoGet = (TabInfo)tabLevel1_4.getTag();
else if(nPos == 2)
infoGet = (TabInfo)tabLevel1_4_1.getTag();
else if(nPos == 3)
infoGet = (TabInfo)tabLevel1_4_2.getTag();
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_3_1) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_3_1_1))
{
if (nPos == 0)
infoGet = (TabInfo)tabLevel1_3.getTag();
else if(nPos == 1)
infoGet = (TabInfo)tabLevel1_3_1.getTag();
else if(nPos == 2)
infoGet = (TabInfo)tabLevel1_3_1_1.getTag();
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_3_2) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_3_2_1))
{
if (nPos == 0)
infoGet = (TabInfo)tabLevel1_3.getTag();
else if(nPos == 1)
infoGet = (TabInfo)tabLevel1_3_2.getTag();
else if(nPos == 2)
infoGet = (TabInfo)tabLevel1_3_2_1.getTag();
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_3_3) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_3_3_1))
{
if (nPos == 0)
infoGet = (TabInfo)tabLevel1_3.getTag();
else if(nPos == 1)
infoGet = (TabInfo)tabLevel1_3_3.getTag();
else if(nPos == 2)
infoGet = (TabInfo)tabLevel1_3_3_1.getTag();
}
else if((appContext.nCurrentLayoutID == R.layout.fragment_level1_2_1) || (appContext.nCurrentLayoutID == R.layout.fragment_level1_2_2) ||(appContext.nCurrentLayoutID == R.layout.fragment_level1_2_3))
{
if (nPos == 0)
infoGet = (TabInfo)tabLevel1_2.getTag();
else if(nPos == 1)
infoGet = (TabInfo)tabLevel1_2_1.getTag();
else if(nPos == 2)
infoGet = (TabInfo)tabLevel1_2_2.getTag();
else if(nPos == 3)
infoGet = (TabInfo)tabLevel1_2_3.getTag();
}
else if(appContext.nCurrentLayoutID == R.layout.fragment_level1_4_2)
{
if(mActionBar.getTabAt(1).getText() == " Level1_2")
{
if(nPos == 0)
infoGet = (TabInfo)tabLevelHome.getTag();
else if(nPos == 1)
infoGet = (TabInfo)tabLevel1_2.getTag();
else if(nPos == 2)
infoGet = (TabInfo)tabLevel1_2_1.getTag();
else if(nPos == 3)
infoGet = (TabInfo)tabLevel1_4_2.getTag();
}
else
{
if (nPos == 0)
infoGet = (TabInfo)tabLevelHome.getTag();
else if(nPos == 1)
infoGet = (TabInfo)tabLevel1_4.getTag();
else if(nPos == 2)
infoGet = (TabInfo)tabLevel1_4_1.getTag();
else if(nPos == 3)
infoGet = (TabInfo)tabLevel1_4_2.getTag();
}
}
}
catch(Exception e)
{
appContext.showMessage("Error","[getSelectedTab]: "+e.toString());
}
return infoGet;
}