6

Ich habe eine einfache Aktivität, in der es eine Navigationsschublade gehostet wird. Einer seiner Einträge ist ein WebView, der sehr viel zu Lasten bringt (es zeigt Gmail an, so dass das Folgen all dieser fiesen Weiterleitungen ziemlich viel kostet).Wie kann die Wiederherstellung von Fragmenten verhindert werden, wenn diese aus NavigationDrawer ausgewählt wird?

Ich möchte das Fragment beibehalten, auch wenn verschiedene Auswahlen auftreten. Ich dachte, dass diese Lösungen funktionieren könnten. Sie haben nicht.

1) nicht das Fragment neu erstellen: selbst wenn mWebmailFragment tatsächlichist nicht null, onCreateView() in jedem Fall aufgerufen wird.

private Fragment mWebmailFragment /*, the others */; 

public void selectItem(int position) { 
    Fragment fragment = null; 
    switch (position) { 
     case FRAGMENT_CODE_WEBMAIL: 
      mWebmailFragment = mWebmailFragment!=null ? mWebmailFragment : new WebmailFragment(); 
      fragment = mWebmailFragment; 
      break; 
    // ... 
} 

2) Wenn onCreateView() aufgerufen wird, funktioniert der Erhalt des WebView-Objektstatus möglicherweise. Nun, es tut nicht: Debuggen Ich entdeckte, dass SavedInstanceState immer null ist. Ich weiß nicht warum.

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 

    // Retain instance 
    setRetainInstance(true); 

    //.... 

    // SavedState 
    if (savedInstanceState != null) { 
      mWebView.restoreState(savedInstanceState); 
    } else { 
     // do stuff 
    } 
} 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    mWebView.saveState(outState); 
} 
+0

Wie ändern Sie Fragmente, wenn Sie ein anderes auswählen? Wenn Sie sie "ersetzen", versuchen Sie vielleicht stattdessen "show()" und "hide()". – Maximosaic

+0

Haben Sie jemals eine Lösung gefunden? –

+0

Nein ... Ich habe die Logik "Alle ausblenden - Show selected" verwendet, aber wenn eine Orientierungsänderung auftritt, wird alles durcheinander gebracht. Zur Zeit löste ich das Erzwingen der Benutzeroberfläche im Hochformat, aber Sie können verstehen, wie groß eine Grenze ist. – Gianluca

Antwort

0

Ich denke, Sie haben nicht verwenden verstecken/Show richtig. Verwenden Sie in Ihrer Fragmenttransaktion add(), um das Fragment anstelle von replace() zu laden.

Ändern Sie diese

final FragmentManager myFragmentManger = myContext 
        .getSupportFragmentManager(); 
      final FragmentTransaction myFragmentTransaction = myFragmentManger 
        .beginTransaction(); 
      myFragmentTransaction.replace(R.id.content, aFragment, 
        aFragmentTag.getFragment()); 

zu

final FragmentManager myFragmentManger = myContext 
        .getSupportFragmentManager(); 
      final FragmentTransaction myFragmentTransaction = myFragmentManger 
        .beginTransaction(); 
      myFragmentTransaction.add(R.id.content, aFragment, 
        aFragmentTag.getFragment()); 

Wenn Sie ersetzen verwenden, Create() des Fragments wird jedes Mal aufgerufen werden. Versuchen Sie, add() wie oben beschrieben zu verwenden.