Bonjour,
Je me décide à poster car je ne trouve pas la solution à mon problème après une journée entière.
Je suis actuellement entrain de développer une appli en utilisant les fragments, cependant j'ai un problème fort gênant.
C'est la premier fois que je post sur un forum a cause d'un problème de code je vais donc essayer d'être le plus clair possible, si il vous manque un bout de code ou un élément je suis a votre disposition Voici une petite description de l'interface :
En mode Paysage :
J'ai 3 fragment visible deux sur la moitié gauche de l'écran de taille égal(on a la possibilité de cacher l'un ou l'autre, de ce fait le fragment encore visible se redimensionne) et un sur la partie droite de l'écran
En mode portrait :
J'ai un viewpager custom avec 3 onglets(les 3 fragments)
Problème:
Le problème viens du fait que je passe plusieurs fois dans le onCreateView, onActivityCreate, etc.. de mes fragments.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | 02-10 13:20:15.575: I/onCreate(7729): DynamicUIactivity 02-10 13:20:15.626: I/onAttach(7729): MenuFragment 02-10 13:20:15.627: I/onCreateView(7729): MenuFragment 02-10 13:20:15.634: I/onActivityCreated(7729): MenuFragment 02-10 13:20:15.707: I/onResume(7729): MenuFragment 02-10 13:20:15.708: I/onAttach(7729): TabFragment 02-10 13:20:15.708: I/onCreateView(7729): TabFragment 02-10 13:20:15.715: I/onActivityCreated(7729): TabFragment 02-10 13:20:15.717: I/OnCreateView(7729): CarteFragment 02-10 13:20:22.763: I/onPause(7729): MenuFragment 02-10 13:20:22.765: I/onStop(7729): DynamicUIactivity 02-10 13:20:22.765: I/onStop(7729): MenuFragment 02-10 13:20:22.765: I/onStop(7729): TabFragment 02-10 13:20:22.809: I/onAttach(7729): MenuFragment 02-10 13:20:22.809: I/onAttach(7729): TabFragment 02-10 13:20:22.809: I/onCreate(7729): DynamicUIactivity 02-10 13:20:22.822: I/onAttach(7729): MenuFragment 02-10 13:20:22.822: I/onCreateView(7729): MenuFragment 02-10 13:20:22.843: I/onCreateView(7729): MenuFragment 02-10 13:20:22.844: I/onActivityCreated(7729): MenuFragment 02-10 13:20:22.900: I/onCreateView(7729): TabFragment 02-10 13:20:22.904: I/onActivityCreated(7729): TabFragment 02-10 13:20:22.904: I/OnCreateView(7729): CarteFragment 02-10 13:20:22.906: I/onActivityCreated(7729): MenuFragment 02-10 13:20:22.906: I/OnCreateView(7729): CarteFragment 02-10 13:20:22.908: I/onAttach(7729): TabFragment 02-10 13:20:22.908: I/onCreateView(7729): TabFragment 02-10 13:20:22.911: I/onActivityCreated(7729): TabFragment 02-10 13:20:22.922: I/onResume(7729): MenuFragment 02-10 13:20:22.923: I/onResume(7729): MenuFragment 02-10 13:20:27.575: I/onPause(7729): MenuFragment 02-10 13:20:27.575: I/onPause(7729): MenuFragment 02-10 13:20:27.575: I/onStop(7729): DynamicUIactivity 02-10 13:20:27.575: I/onStop(7729): MenuFragment 02-10 13:20:27.575: I/onStop(7729): TabFragment 02-10 13:20:27.575: I/onStop(7729): MenuFragment 02-10 13:20:27.575: I/onStop(7729): TabFragment 02-10 13:20:27.625: I/onAttach(7729): MenuFragment 02-10 13:20:27.625: I/onAttach(7729): TabFragment 02-10 13:20:27.625: I/onAttach(7729): TabFragment 02-10 13:20:27.625: I/onCreate(7729): DynamicUIactivity 02-10 13:20:27.651: I/onCreateView(7729): MenuFragment 02-10 13:20:27.652: I/onActivityCreated(7729): MenuFragment 02-10 13:20:27.705: I/onCreateView(7729): TabFragment 02-10 13:20:27.709: I/onActivityCreated(7729): TabFragment 02-10 13:20:27.709: I/OnCreateView(7729): CarteFragment 02-10 13:20:27.711: I/OnCreateView(7729): CarteFragment 02-10 13:20:27.713: I/onCreateView(7729): TabFragment 02-10 13:20:27.717: I/onActivityCreated(7729): TabFragment 02-10 13:20:27.723: I/onResume(7729): MenuFragment |
Du coup je suis allez regarder sur internet et j'ai trouvé:
, et j'ai lu qu'il fallait que je rajoute :
1 | if (savedInstanceState == null) |
dans le onCreate de mon FragmentActivity.
Et voici du code:
Le XML en mode paysage
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:baselineAligned="false" android:orientation="horizontal" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:baselineAligned="false" android:orientation="vertical" > <LinearLayout android:id="@+id/tabFragmentLeftTop" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:orientation="vertical" > </LinearLayout> <LinearLayout android:id="@+id/carteFragmentLeftBottom" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:orientation="vertical" > </LinearLayout> </LinearLayout> <fragment android:id="@+id/menuDetailsFragment" android:name="com.netisys.sireo.fragments.MenuFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> </LinearLayout> |
Le XML en mode portrait
1 2 3 4 5 6 7 | <?xml version="1.0" encoding="utf-8"?> <com.netisys.sireo.utils.CustomViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/viewpager"> </com.netisys.sireo.utils.CustomViewPager> |
Le onCreate de de ma class MainActivity extends FragmentActivity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("onCreate", "MainActivity"); setContentView(R.layout.activity_main); globalClass = ((GlobalClass)getApplication()); backButtonClick(); final ActionBar actionBar = creationAffichageActionBar(); gestionSession(); //Code avant modification préconiser sur internet pour résoudre le probleme // tabFragment = TabFragment.newInstance(); // carteFragment = CarteFragment.newInstance(); // menuFragment = MenuFragment.newInstance(); if (savedInstanceState == null) { tabFragment = TabFragment.newInstance(); getSupportFragmentManager().beginTransaction().add(R.id.tabFragmentLeftTop, tabFragment).commit(); carteFragment = CarteFragment.newInstance(); getSupportFragmentManager().beginTransaction().add(R.id.carteFragmentLeftBottom, carteFragment).commit(); menuFragment = MenuFragment.newInstance(); getSupportFragmentManager().beginTransaction().add(R.id.menuDetailsFragment, menuFragment).commit(); } if(!tabFragment.getListReleveActif().isEmpty()) mNotifCount = tabFragment.getListReleveActif().size(); if(getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){ buildUIPortrait(actionBar); }else { buildCarteFragment(); buildTabFragment(); globalClass.setChangeOrientation(true); } } |
Méthode permettant de créer l'interface en mode portrait
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /** * Méthode permettant de construire l'interface principale entre les 3 fragments en mode portrait */ private void buildUIPortrait(final ActionBar actionBar) { actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Création de l'adapter qui s'occupera de l'affichage de la liste de Fragments this.mPagerAdapter = new ScreenSlidePagerAdapter(super.getSupportFragmentManager(), tabFragment, carteFragment, menuFragment); pager = (ViewPager) super.findViewById(R.id.viewpager); // Affectation de l'adapter au ViewPager pager.setAdapter(this.mPagerAdapter); pager.setOffscreenPageLimit(3); pager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); } }); ActionBar.TabListener tabListener = new ActionBar.TabListener() { @Override public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) { } @Override public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) { pager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) { } }; for (int i = 0; i < mPagerAdapter.getCount(); i++) { actionBar.addTab(actionBar .newTab() .setText(mPagerAdapter.getPageTitle(i)) .setTabListener(tabListener)); } } |
La classe du viewPager Custom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | public class ScreenSlidePagerAdapter extends FragmentPagerAdapter { private static final int NUM_PAGES = 3; private TabFragment tabFragment; private CarteFragment carteFragment; private MenuFragment menuFragment; public ScreenSlidePagerAdapter(FragmentManager fm, TabFragment tabFragment, CarteFragment carteFragment, MenuFragment menuFragment) { super(fm); this.tabFragment = tabFragment; this.carteFragment = carteFragment; this.menuFragment = menuFragment; } @Override public Fragment getItem(int position) { switch (position) { case 0: return menuFragment; case 1: return tabFragment; case 2: return carteFragment; default: break; } return null; } @Override public int getCount() { return NUM_PAGES; } @Override public CharSequence getPageTitle(int position) { String tabLabel = null; switch (position) { case 0: tabLabel = "Menu"; break; case 1: tabLabel = "Tableau"; break; case 2: tabLabel = "Carte"; break; } return tabLabel; } } |
Construction de l'interface en mode paysage
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * Méthode qui crée et ajoute en mode paysage le fragment contenant la carte */ private void buildCarteFragment() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); if(!globalClass.getChangeOrientation()){ ft.add(R.id.carteFragmentLeftBottom, carteFragment); }else{ ft.replace(R.id.carteFragmentLeftBottom, carteFragment); } ft.commit(); } /** * Méthode qui crée et ajoute en mode paysage le fragment contenant le tableau */ private void buildTabFragment() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); if(!globalClass.getChangeOrientation()){ ft.add(R.id.tabFragmentLeftTop, tabFragment); }else{ ft.replace(R.id.tabFragmentLeftTop, tabFragment); } ft.commit(); } |
onCreateView du fragment "tabFragment"
1 2 3 4 5 6 7 | @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i("onCreateView", "TabFragment"); final View fragmentTab = inflater.inflate(R.layout.fragment_tab, container, false); fragmentTab.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1)); return fragmentTab; } |
On createView du fragment "carteFragment"
1 2 3 4 5 6 7 8 9 | @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i("OnCreateView", "CarteFragment"); View rootView = inflater.inflate(R.layout.fragment_carte, container, false); LinearLayout layout = (LinearLayout)rootView.findViewById(R.id.mainLayout); mapView = new MapView(rootView.getContext(), coucheVectoRoute, getActivity()); layout.addView(mapView,LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT); return rootView ; } |
On createView du fragment "MenuFragment"
1 2 3 4 5 6 7 8 9 | @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(savedInstanceState != null) { listReleveActif = savedInstanceState.getParcelableArrayList("listReleveActif"); listReleve = savedInstanceState.getParcelableArrayList("listReleve"); newAdapter = savedInstanceState.getBoolean("newAdapter"); } } |