Bonjour,

J'utilise un système d'onglet avec les fragments :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
 
mTabHost = (TabHost)findViewById(android.R.id.tabhost);
mTabHost.setup();
mTabManager = new TabManager(this, mTabHost, R.id.realtabcontent);    mTabManager.addTab(mTabHost.newTabSpec("frag1").setIndicator(createTabView(mTabHost.getContext(), "Frag1")), Fragment1.class, null);   mTabManager.addTab(mTabHost.newTabSpec("frag2").setIndicator(createTabView(mTabHost.getContext(), "Frag2")), Fragment2.class, null);
Les onglets sont gérés avec ma classe TabManager (voir plus bas).

Mon problème lorsque je switche entre les Fragments, je n'arrive pas à sauvegarder leur état actuelle. J'ai essayé avec la méthode onSaveInstanceState() mais elle n'est jamais appelé (habituellement elle est appelé dans le onDestroy())

Ma question
Avez-vous une méthode ou des exemples pour sauvegarder l'état d'un Fragment, pour que lorsque je revienne dessus, il reste dans l'état où je l'avais quitté?


Classe TabManager pour gérer le système d'onglets

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 
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;
    }
}