multiple appels des méthodes du cylce de vie des fragments

Utilisation des Fragments: probleme multiple appels des méthodes du cylce de vie des fragments

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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");
            }
    }

Édité par Slasch

+1 -0

Salut,

Recopier quelque chose venant d'une ressource internet sans la comprendre, ce n'est jamais une bonne idée. Chaque problème est différent dépendant potentiellement de ton application, de ton IDE, de tes dépendances et/ou de ton système.

Concernant ton problème, j'ai 2 questions :

Je suis actuellement entrain de développer une appli en utilisant les fragments, cependant j'ai un problème fort gênant.

Oui mais quel est ce problème ? Qu'est ce qui n'allait pas dans ton application avant que tu tentes d'appliquer la solution que tu as trouvé sur Internet ?

1
2
3
4
5
if (savedInstanceState == null) {
  // Faire quelque chose au lancement de l'Activity.
} else {
  // Faire quelque chose le reste du temps.
}

Pour t'expliquer, ce test peut être fait dans la méthode onCreate d'une Activity (ou FragmentActivity) lorsqu'on veut faire quelque chose au premier lancement de l'écran. C'est-à-dire que lorsque ton écran est lancé, il rentrera dans cette condition. Une fois que tu fais une rotation de l'écran, Android va conserver de l'information (et toi si tu veux en rajouter) et tout placer dans ce Bundle. Il ne sera donc plus null et rentrera dans la branche else.

Donc, rien ne sert de venir copier toutes tes sources quand tu as une question. Expose plus clairement ton problème initiale, les solutions que tu as envisagé et appuie le tout avec du code qui te semble nécessaire pour la compréhension du code. Nous te demanderons des sources supplémentaires si nécessaire.

+0 -0
Auteur du sujet

Merci pour ta réponse Andr0,

Concernant ton problème, j'ai 2 questions :

Je suis actuellement entrain de développer une appli en utilisant les fragments, cependant j'ai un problème fort gênant.

Oui mais quel est ce problème ? Qu'est ce qui n'allait pas dans ton application avant que tu tentes d'appliquer la solution que tu as trouvé sur Internet ?

Je m'excuse, ma tournure de phrase et construction du sujet n'étaient pas au point.

En faite le problème de base comme indiqué dans le premier post (avant les modifications apporté pour savedInstanceState) est un passage multiple dans les méthodes de création de chacun de mes fragments après une rotation de l'écran(Portrait -> paysage -> portrait). Tu peux le voir dans les logs ci-dessous,

 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

De ce fait, j'ai les variables de mes fragments qui se mettent à null, ou les fragments qui se reinitialise lors du deuxième passage, alors que tout était normal au premier appel.

Tu trouvera ci-dessous le code de la méthode onCreate de mon Activity(FragmentActivity) avant modification avec le savedInstanceState. Je précise qu'avant modification, l'affichage de l'interface se faisait sans problème mise à part le passage multiple dans les méthodes des fragments (onCreate, onCreateView, onActivityCreated, etc…), j'ai juste des données qui disparaisent suite à leur réinitialisation.

Par exemple dans la méthode onCreate de mon fragment "TabFragment" (que tu pourras trouvé à la suite du code du onCreate de mon Activity) au deuxième passage mon savedInstanceState redevient à null et du coup mes variables ne sont pas update et se retrouve vide.

 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
@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();

        tabFragment = TabFragment.newInstance();
        carteFragment = CarteFragment.newInstance();
        menuFragment = MenuFragment.newInstance();

        if(!tabFragment.getListReleveActif().isEmpty())
            mNotifCount = tabFragment.getListReleveActif().size();

        if(getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
            buildUIPortrait(actionBar);
        }else {
            buildCarteFragment();  
            buildTabFragment();
            globalClass.setChangeOrientation(true);
        }
    }

Voici le code du onCreate du fragment "TabFragment":

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");
            }
    }

Édité par Slasch

+0 -0

Etant donné qu'une Activity se recrée entièrement lors d'un changement d'orientation, c'est normal que tu repasses par toutes les méthodes de son cycle de vie et des méthodes du cycle de vie de ses fragments qu'elle contient. Ce n'est pas un problème d'Android, c'est son fonctionnement.

Par exemple dans la méthode onCreate de mon fragment "TabFragment" (que tu pourras trouvé à la suite du code du onCreate de mon Activity) au deuxième passage mon savedInstanceState redevient à null et du coup mes variables ne sont pas update et se retrouve vide.

Où ces données sont-elles envoyées au fragment TabFragment. Je vois dans ta méthode onCreate de ton Activity que tu appelles la méthode statique TabFragment.newInstance(); sans aucun argument pour lui passer des informations.

+0 -0
Auteur du sujet

Encore Merci pour ta réponse Andr0. Je vais taché de continuer à t'expliquer le plus clairement possible.

Etant donné qu'une Activity se recrée entièrement lors d'un changement d'orientation, c'est normal que tu repasses par toutes les méthodes de son cycle de vie et des méthodes du cycle de vie de ses fragments qu'elle contient. Ce n'est pas un problème d'Android, c'est son fonctionnement.

Oui, ça je l'avais lu dans ton tuto :-), cependant je ne devrais passé qu'une seule fois dans chaque méthodes du cycle de vie des fragments, et non pas plusieurs fois lors d'une simple rotation d'écran (portrait -> paysage), comme ci dessous

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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

On remarque bien ici que chaque méthode du cycle de vie est appelée deux fois. Si je tri les log on a :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
02-10 13:20:22.809: I/onAttach(7729): MenuFragment
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.906: I/onActivityCreated(7729): MenuFragment
02-10 13:20:22.922: I/onResume(7729): MenuFragment
02-10 13:20:22.923: I/onResume(7729): MenuFragment
----------------------------------------------------------------------------
02-10 13:20:22.809: I/onAttach(7729): TabFragment
02-10 13:20:22.908: I/onAttach(7729): TabFragment
02-10 13:20:22.900: I/onCreateView(7729): TabFragment
02-10 13:20:22.908: I/onCreateView(7729): TabFragment
02-10 13:20:22.904: I/onActivityCreated(7729): TabFragment
02-10 13:20:22.911: I/onActivityCreated(7729): TabFragment
----------------------------------------------------------------------------
02-10 13:20:22.809: I/onCreate(7729): DynamicUIactivity
----------------------------------------------------------------------------
02-10 13:20:22.904: I/OnCreateView(7729): CarteFragment
02-10 13:20:22.906: I/OnCreateView(7729): CarteFragment

Le nombre de passage peut augmenter, il m'est arrivé d'avoir 3 appels des méthodes du cylce de vie des fragments.

Par exemple dans la méthode onCreate de mon fragment "TabFragment" (que tu pourras trouvé à la suite du code du onCreate de mon Activity) au deuxième passage mon savedInstanceState redevient à null et du coup mes variables ne sont pas update et se retrouve vide.

Où ces données sont-elles envoyées au fragment TabFragment. Je vois dans ta méthode onCreate de ton Activity que tu appelles la méthode statique TabFragment.newInstance(); sans aucun argument pour lui passer des informations.

Je pense que tu as compris que la méthode statique TabFragment.newInstance(); ne fais que me retourner une instance du fragment.

1
2
3
4
    //Méthode permettant la création d'une instance du fragment
    public static TabFragment newInstance() {
        return new TabFragment();
    }

Je sais pas si j'ai bien compris ta question, mais les données ne sont pas envoyées, elles appartiennent au fragment, se sont des variables de la classe que j'enregistre dans le savedInstanceState pour les récupérer dans le onCreate.

1
2
3
4
5
6
7
8
    @Override
    public void onSaveInstanceState(Bundle outState) {
        // Sauvegarde des données du contexte utilisateur
        outState.putParcelableArrayList("listReleveActif", listReleveActif);
        outState.putParcelableArrayList("listReleve", listReleve);
        outState.putBoolean("newAdapter", newAdapter);
        super.onSaveInstanceState(outState);
    }

Édité par Slasch

+0 -0

Est-ce que tu as essayé d'initialiser tes 3 fragments uniquement au premier lancement de ton écran et puis, ne faire que les utiliser ? C'est-à-dire initialiser tes fragments uniquement quand ton bundle est null ?

+0 -0
Auteur du sujet

Bonjour Andr0.

Est-ce que tu as essayé d'initialiser tes 3 fragments uniquement au premier lancement de ton écran et puis, ne faire que les utiliser ? C'est-à-dire initialiser tes fragments uniquement quand ton bundle est null ?

Tu veux dire faire quelques choses comme ça :

 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
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("onCreate", "MainActivity");
        setContentView(R.layout.activity_main);

        backButtonClick();

        final ActionBar actionBar = creationAffichageActionBar();

        gestionSession();

        if(savedInstanceState == null){
            tabFragment = TabFragment.newInstance();
            carteFragment = CarteFragment.newInstance();
            menuFragment = MenuFragment.newInstance();
        }

        if(!tabFragment.getListReleveActif().isEmpty())
            mNotifCount = tabFragment.getListReleveActif().size();

        if(getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
            buildUIPortrait(actionBar);
        }else {
                        buildCarteFragment();   
                        buildTabFragment();
            orientationChange = true;
        }
    }

Si oui, j'ai une erreur après la première rotation car mes fragments sont null, et du coup if(!tabFragment.getListReleveActif().isEmpty()) me sort un nullpointer, ce qui semble logique puisque après la rotation il n'initialise pas les fragments car mon bundle est null.

Édité par Slasch

+0 -0
Auteur du sujet

Bonjour tout le monde, Je suis actuellement toujours bloqué sur ce problème même après avoir passé 4 jours complet dessus.

J'ai essayé une autre implémentation de ma méthode onCreate de ma 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("onCreate", "MainActivity");
        setContentView(R.layout.activity_main);

        backButtonClick();

        final ActionBar actionBar = creationAffichageActionBar();

        gestionSession();

        if (findViewById(R.id.tabFragmentLeftTop) != null) {
            tabFragment = (TabFragment) getSupportFragmentManager().findFragmentById(R.id.tabFragmentLeftTop);
            if (tabFragment == null) {
                tabFragment = TabFragment.newInstance();
                FragmentManager fm = getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.add(R.id.tabFragmentLeftTop, tabFragment);
                ft.commit();

            }else {
                tabFragment = TabFragment.newInstance();
                FragmentManager fm = getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();           
                ft.replace(R.id.tabFragmentLeftTop, tabFragment);
                ft.commit();
            }
        }else{
                tabFragment = TabFragment.newInstance();
        }

        if (findViewById(R.id.carteFragmentLeftBottom) != null) {
            carteFragment = (CarteFragment) getSupportFragmentManager().findFragmentById(R.id.carteFragmentLeftBottom);
            if (carteFragment == null) {
                carteFragment = CarteFragment.newInstance();
                FragmentManager fm = getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.add(R.id.carteFragmentLeftBottom, carteFragment);
                ft.commit();

            }else {
                carteFragment = CarteFragment.newInstance();
                FragmentManager fm = getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();           
                ft.replace(R.id.carteFragmentLeftBottom, carteFragment);
                ft.commit();
            }
        }else{
            carteFragment = CarteFragment.newInstance();
        }

        if (findViewById(R.id.menuDetailsFragment) != null) {
            menuFragment = (MenuFragment) getSupportFragmentManager().findFragmentById(R.id.menuDetailsFragment);
            if (menuFragment == null) {
                menuFragment = MenuFragment.newInstance();
                FragmentManager fm = getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.add(R.id.menuDetailsFragment, menuFragment);
                ft.commit();

            }else {
                menuFragment = MenuFragment.newInstance();
                FragmentManager fm = getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();           
                ft.replace(R.id.menuDetailsFragment, menuFragment);
                ft.commit();
            }
        }else{
            menuFragment = MenuFragment.newInstance();
        }

        if(!tabFragment.getListReleveActif().isEmpty())
            mNotifCount = tabFragment.getListReleveActif().size();

        if(getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
            buildUIPortrait(actionBar);
        }
    }

Mais rien n'y fait, les fragments sont toujours créer deux fois.

Avez vous des idées, car la j'avoue que j'en ai plus :-/

edit : Pensez-vosu que ça viendrai du fait qu'en mode paysage j'ai 3 fragments visibles que je gère moi même, et qu'en mode portrait j'ai un viewpager custom avec 3 onglets correspondant aux 3 fragments ?

Édité par Slasch

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte