2017-06-28 5 views
0

Ich bin ziemlich neu in android programmierung, also bitte mit mir ertragen. Ich habe versucht, über SO, tutorialspoint, große Nerdranch, usw. zu suchen, aber ich finde das nicht: wie mache ich ein Fragment persistent, nachdem ein Benutzer die Haupt- oder Übersichtsknöpfe gedrückt hat? Zum Beispiel:android fragment zerstört nach hause oder übersicht buttons sind gedrückt

Ich habe zwei Fragmente A und B in einer Aktivität mit einer Umschaltfläche, um zwischen den beiden Fragmenten zu wechseln. Standardmäßig wird das Fragment A beim Erstellen der Aktivität auf dem Bildschirm geladen. Wenn ich zu Fragment B wechsle und entweder Home oder Übersicht drücke und dann zur App zurückkehre, wird Fragment A angezeigt. Ich verstehe, warum es angezeigt wird, aber was ich nicht verstehe, ist, wie Fragment B angezeigt wird.

Ich habe über den Backstack, savedInstanceState und setRetainInstance (unter mehreren anderen) gelesen, aber nicht in der Lage, es herauszufinden.

Ich zwingend onAttach(Context context), onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) und onViewCreated(View view, Bundle savedInstanceState) in beiden Fragmenten und onStart() und onCreate(Bundle savedInstanceState) in meiner Tätigkeit.

Fragmente:

@Override 
public void onAttach(Context context) { 
    this.context = context; 
    faContext = (FragmentActivity) context; 

    super.onAttach(context); 
}// end onAttach(Activity activity) 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
    Bundle bundle = this.getArguments(); 

    if(bundle != null) { 
     String bundleAdminId = getString(R.string.bundle_admin_name); 
     adminName = bundle.getString(bundleAdminId); 
    } 
    else { 
     Log.d("BUNDLE_Profile", "bundle is null"); 
    } 

    // Defines the xml file for the fragment 
    return inflater.inflate(R.layout.fragment_profile, parent, false); 
}// end onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) 

onViewCreated nur Schaltfläche Event-Handler hat

Aktivität:

@Override 
public void onStart() { 
    super.onStart(); 

    // start the home fragment 
    createFragment(new HomeFragment(), R.id.frag_container); 

    // update the local storage 
}// end onStart() 


private void createFragment(Fragment fragment, int fragContainerId) { 
    // make sure the passed fragment isn't null 
    if(fragment != null) { 
     FragmentTransaction ft = faContext.getSupportFragmentManager().beginTransaction(); 
     ft.replace(fragContainerId, fragment); 
     ft.commit(); 
    } 
}// end createFragment(Fragment fragment)` 

onCreate hat auch Handler Taste

+0

, warum Sie nicht Ihre Fragmente in der OnCreate Methode erstellen? –

Antwort

1

Sie können die Fragmentposition nicht beibehalten, wenn Sie die App erneut starten, sofern sie nicht gespeichert wird. So könnte man beim Wechseln zwischen den Fragmenten die aktuelle Position des Fragments in Shared Preference speichern.Beim Neustart der Anwendung lesen Sie die zuvor gespeicherte Fragmentposition und aktualisieren den SharedPreferences-Wert beim Umschalten.

 @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 


      sharedPreferences = getSharedPreferences("fragmentPosition",MODE_PRIVATE); 

      if(sharedPreferences.getInt("position",0)==1) loadFragmentOne(); 
      else loadFragmentTwo(); 
     } 

     public void onToggleMethod(){ 

      if(currentToggle ==1){ 
       LoadFragmentTwo(); 
       UpdateSharedPreference(); 
      } 
      else{ 
       loadFragmentOne(); 
       UpdateSharedPreference(); 
      } 
     } 
+0

Auch wenn die App nicht vollständig beendet wurde? –

+0

Ja ... Es dauert, bis Sie freigegebene Einstellungen löschen oder die App-Daten löschen – Jay

2

Verwenden Sie Tags ein fragment.Try diese zu öffnen Funktion

public void openNewFragment(Fragment f, String tag) { 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag); 
    { 
     if (fragment != null) { 
      if (currentFragment != null) { 
       if (fragment.getClass().equals(currentFragment.getClass())) { 
        drawerLayout.closeDrawers(); 
        return; 
       } 
      } 
      ft.show(fragment); 
      ft.hide(currentFragment); 
      currentFragment = fragment; 
     } else { 
      if (currentFragment != null) 
       ft.hide(currentFragment); 
      ft.add(R.id.container, f, tag); 
      currentFragment = f; 
     } 
     ft.commit(); 


    } 
} 

In dieser Funktion müssen Sie den Fragmentnamen und sein Tag angeben.

1

Offensichtlich geht die Aktivität in den gestoppten Modus und wird gestartet, wenn Sie nach einiger Zeit von zu Hause wieder zur Aktivität zurückkehren. Kann sein, weil die Ressourcen aus dem Speicher freigegeben sind.

Um mehr darüber besser zu wissen, versuchen Sie einfach auf Fragment b zu sein und machen Sie sofort den Home Press und kommen Sie zurück zur App durch die letzten Apps Abschnitt und sehen Sie das Verhalten.

Auch wenn das Problem ist das, was ich oben dann .. angegeben habe versuchen folgende

  1. Versuchen Sie eine Variable erstellen, die statisch ist und versuchen, das zuletzt geladene Fragment und in der bei der Wiederaufnahme der Tätigkeit Last zu erinnern, die Fragment, das zuletzt geladen wurde.
  2. Sonst im Onstart laden Sie das Fragment, indem Sie den Fragmentmanager mit einem Tag verwenden, und legen Sie eine Bedingung vor dem Laden, um zu überprüfen, ob das Fragment schon im Speicher ist, wenn Sie nichts laden.

So etwas .. onStart(){ if(fragmentManager.getFragmentByTag("String tag")== null){ createFragment(); } }

Versuch und lassen Sie mich wissen, ob dies sinnvoll ist.

+0

richtig formatieren Code '' '' Knopf oder Einzug mit 4 Leerzeichen verwenden –

+0

Sehr nützliche Informationen! Leider war es nicht das Problem. –

1

Versuchen Sie, die onStart Methode wie folgt zu ändern,

@Override 
    public void onStart() { 
     super.onStart(); 
     // start the home fragment 

     if(faContext.getSupportFragmentManager().findFragmentById(R.id.frag_container) == null) { 
      createFragment(new HomeFragment(), R.id.frag_container); 
     } 

     // update the local storage 
    }// end onStart() 
Verwandte Themen