2017-10-27 3 views
-1

Ich habe schon in vielen der ähnliche Frage sah aber noch bin ich nicht in der Lage Container-Layout (FrameLayout) meiner Hauptaktivität aus einem Fragment zu ersetzen, die in diesem Container sichtbar ist.
Hier ist, was ich versuche, ich habe eine Haupttätigkeit mit Navigationsleiste zu tun und auf Navigationsleiste Elemente klicken Ich ändere entsprechend Fragment, ich bin bis zu diesem Erfolg. Diese Fragmente sind, Register, Kategorien, Kontakt usw. Ich ändere/ersetzen Fragmente mit FragmentManager, FragmentTransaction seine Methode ersetzen. Überprüfen Sie den Code untenWie Fragment von Eltern Layout von Kind ersetzen

public void changeFragment(int position) { 
     FragmentManager manager = getSupportFragmentManager(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     Fragment fragment = new Fragment(); 
     BlankFragment blankFragment = new BlankFragment(); 

     switch (position) { 
      case 0: 
       fragment = new FragMain(); 
       break; 
      case 1: 
       fragment = new FragPrivacyPolicy(); 
       break; 
      case 2: 
       fragment = new SettingsFragment(); 
       break; 
      case 101: 
       fragment = new FragLogin(); 
       break; 
      case 102: 
       fragment = new FragRegister(); 
       break; 
      case 103: 
       fragment = new FragEditAccount(); 
       break; 
      case 104: 
       fragment = new FragOrderHistory(); 
       break; 
      case 105: 
       fragment = new FragForgotPass(); 
       break; 
      case 106: 
       fragment = new FragOrderDetail(); 
       break; 
      case 108: 
       fragment = new FragAboutUs(); 
       break; 
      case 109: 
       fragment = new FragContactUs(); 
       break; 
      case 110: 
       fragment = new FragMain(); 
       break; 
     } 

     transaction.replace(R.id.flFragments, fragment); 
     transaction.commit(); 
    } 

, die als alle meine Fragmente extends Fragment funktioniert gut. Das Problem tritt auf, wenn ich versuche, diese Methode in einem der Fragmente aufzurufen, die in diesem Container sichtbar sind. Angenommen, ich habe eine Textview in FragLogin sagen: „Sie haben kein Konto haben Register“ usw. klicken, um diese Textview Ich habe FragRegister in demselben Behälter von mainActivity zu öffnen. Als ich es wie dies in meinem FragLogin App tun Abstürze deutete auf die transaction.commit();

MainActivity activity = new MainActivity(); 
activity.changeFragment(102); 

Und wenn ich wie diese versuchen

FragRegister fragRegister = new FragRegister(); 
// Fragment fragRegister = new FragRegister(); 
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
    transaction.addToBackStack(null); 
    transaction.replace(R.Id.flFragments, fragRegister).commit(); 

es nicht die R.Id.flFragments als im Inneren des mainActivity nicht in FragLogin erkennen.

Also, wie kann ich das FragRegister in mainActivity ‚s Behälter aus FragLogin ersetzen?

Antwort

2

Verwenden Sie getChildFragmentManager() nicht, da es zum Fragmentmanager gehört und der Container, der das aktuelle Fragment enthält, der Aktivitätscontainer ist. Verwenden Sie stattdessen getSupportFragmentManager().

Siehe auch diese abgetan

MainActivity activity = new MainActivity(); 
activity.changeFragment(102); 

Sie sind ein neues Objekt der mainactivity schaffen, die bereits created.You haben die Aktivität Methode aus Fragmenten getActivity() .Call die changeFragment Methode wie folgt verwendet nennen.

((MainActivity)getActivity()).changeFragment(102); 
+0

danke es funktioniert jetzt :) mit 'getActivity()' jetzt funktionieren beide Methoden gut. –

+0

Ihre meisten Welcome.If meine Antwort geholfen bitte akzeptieren :) – Anonymous

+0

ich upvoted weil es Frist Antwort zu akzeptieren ist. Jetzt auch akzeptiert. –

Verwandte Themen