16

Allgemeine Frage Kann ich Fragmente als Singletons definieren?Fragment als Singleton in Android

Spezifische Frage In meiner Anwendung habe ich einen ‚FragmentActivity‘ mit einem FragmentPager, die zwei Fragmente hat, FragmentA und FragmentB.

I definiert die Fragmente als Singletons in der FragmentA erstreckt Fragment Klasse:

private static instance = null; 

public static FragmentA getInstance() { 
    if (instance == null) { 
     instance = new FragmentA(); 
    } 
    return instance; 
} 
private FragmentA() {} 

und in meinem FragmentPagerAdapter:

@Override 
public Fragment getItem(int position) { 
    switch(position){ 
    Fragment fragment = null; 
    case 0: 
     fragment = FragmentA.getInstance(); 
     break; 
    case 1: 
     fragment = FragmentB.getInstance(); 
     break; 
    } 
    return fragment; 
} 

und das ist, wie ich die Fragmente aufblasen Layout:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    fragmentView = (RelativeLayout) inflater.inflate(R.layout.fragment_a_layout, container, false); 
    return fragmentView; 
} 

Mein Problem:

Wenn ich meine App zum ersten Mal starten, funktioniert alles gut. Wenn ich meine App schließe und sie dann neu starte, sehe ich nicht beide Fragmente.

+0

Was ist private statische Instanz sowieso ?? Ich glaube, es ist ein Fehler hehe .. Meines funktioniert gut – Sheychan

Antwort

23

Fragmente sollen wiederverwendbare Komponenten von Anwendungen sein. Sie sollten sie nicht als Singletons verwenden, stattdessen sollten Sie Fragment.SavedState oder onSavedInstanceState implementieren.

public class YourFragment extends Fragment { 
    // Blah blah blah you have a lot of other code in this fragment 
    // but here is how to save state 
    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("curChoice", mCurCheckPosition); 
    } 
    @Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // savedInstanceState will have whatever you left in the outState bundle above 
    } 
} 
+0

können Sie bitte erklären? –

+0

Sicher, ich werde meine Antwort bearbeiten. – hwrdprkns

+0

Ich wollte das ursprünglich machen, weil meine Fragmente immer sichtbar sind, und ich unterstütze nur Hochformat. –