2016-10-14 7 views
1

Ich habe eine Hauptaktivität mit einigen Elementen. Einer von ihnen ist ein Button. Ich möchte ein Fragment laden, wenn auf die Schaltfläche geklickt wird. Ich möchte, dass das Fragment die gesamte Aktivität abdeckt und nicht nur in einem Layout drin ist. Dann gibt es im Fragment auch einen Button, der ein weiteres Fragment laden muss, das alles abdeckt, dann noch eins und so weiter.Fragment oben auf einer Aktivität

Also habe ich einen OnClickListener auf die Aktivität gesetzt, um den ersten der Fragmente zu laden. Die Aktivität wird problemlos geladen. Wenn ich auf Buttons für andere Aktivitäten klicke, ist alles gut. Aber egal, was ich versuchte, es stürzt immer ab, wenn ich auf den Button klicke, der das Fragment laden soll.

Hier ist der Haupt-Code der Aktivität:

public class SignUpActivity extends AppCompatActivity { 

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

    Button next = (Button) findViewById(R.id.button_next_name); 
    next.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      SignNameFragment nameFragment = new SignNameFragment(); 
      fragmentTransaction.add(PROBABLY_WHAT_I_AM_DOING_WRONG,nameFragment); 
      fragmentTransaction.addToBackStack(null); 
      fragmentTransaction.commit(); 
     } 
    }); 
} 
} 

Alle xml ziemlich gleich sind. RelativeLayout für die Aktivität, FrameLayout für die Fragmente und ScrollView, ImageView, EditText, TextView und Button für alle.

Dinge habe ich versucht, so weit nach Anregungen auf dem Netz:

  • die XML-Hauptaktivität eine RelativeLayout verwendet. Ich versuchte, das Fragment in sie zu laden, aber es versäumt
  • ich es geändert
  • FrameLayout benutzte ich fragmentTransaction.add (R.id.fragment_container, nameFragment)
  • Statt hinzufügen() verwenden, habe ich versucht, ersetzen (R.id.activity_sign_up, nameFragment)
  • Erweiterung zu FragmentActivity
  • einstellen eines FrameLayout als Fragment Container in meinem Haupt-xML-Aktivitäten

ich glaube, mein Fehler ist, dass ich nicht setzen, wo ich will das Fragment in die hinzufügen richtiger Weg.

Ich bin mir ziemlich sicher, dass es ein Anfängerfehler wird, aber ich habe noch nie zuvor Fragmente benutzt. Also irgendwelche Vorschläge?

Dank

EDIT: , dass der Fehler ist, wenn ich auf die Schaltfläche klicken

E/Android Runtime: FATAL AUSNAHME: Haupt Prozess: be.test.test, PID: 16763 java .lang.RuntimeException: [email protected] muss OnFragmentInteractionListener bei layout.SignNameFragment.onAttach (SignNameFragment.java:84) bei android.support.v4.app.FragmentM implementieren anagerImpl.moveToState (FragmentManager.java:1043) bei android.support.v4.app.BackStackRecord.setLastIn (BackStackRecord.java:838) bei android.support.v4.app.BackStackRecord.calculateFragments (BackStackRecord.java:861) bei android.support.v4.app.BackStackRecord.run (BackStackRecord.java:719) bei android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1677) bei android.support.v4.app. FragmentManagerImpl $ 1.run (FragmentManager.java:536) bei android.os.Handler.handleCallback (Handler.java:739) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper .loop (Looper.java: 145) bei android.app.ActivityThread.main (ActivityThread.java:6145) bei java.lang.reflect.Method.invoke (Native Methode) bei java.lang.reflect.Method.invoke (Method.java : 372) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1399) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1194)

+0

Warum Sie den Fehler nicht posten? –

+1

Mögliches Duplikat von [So implementieren Sie OnFragmentInteractionListener] (http://stackoverflow.com/questions/24777985/how-to-implement-onfragmentinteractionlistener) –

+0

Wenn Sie den OnFragmentInteractionListener nicht benötigen, können Sie ihn vollständig entfernen. –

Antwort

1

Ihr Fehler sagt alles, Sie sind nicht implementing ein interface.

Ihre SignUpActivity müssen Schnittstelle OnFragmentInteractionListener implementieren und dann müssen Sie ihre Methoden überschreiben.

sollte wie folgt sein:

public class SignUpActivity extends AppCompatActivity implements SignNameFragment.OnFragmentInteractionListener { 
    //implement the interface methods here 
} 
+0

Das war es. Ich denke, alle Beispiele, die ich überprüft habe, waren älter und verwendeten OnFragmentInteractionListener nicht. Das Seltsame ist, dass ich es eigentlich nirgends benutzt habe, aber ohne es stürzt die App ab. –

+0

Sie können es als akzeptiert markieren, wenn es Ihnen geholfen hat, wenn Sie nicht die Schnittstelle verwenden, können Sie es jederzeit entfernen –

+0

Ich werde es wahrscheinlich später brauchen, um Daten zu übertragen. Aber ich verstehe nicht, warum ich es implementieren muss, wenn es nicht benutzt wird. –

1

sollten Sie ein FrameLayout in der activity_sign_up.xml verwenden und die FragmentManager-Methode ersetzen, um ein Fragment durch ein anderes zu ersetzen.

fragmentManager.beginTransaction().replace(R.layout.activity_sign_up, nameFragment).commit(); 

Ich werde Ihren Code verwenden:

public class SignUpActivity extends AppCompatActivity { 

      private FragmentManager fragmentManager; 
      private Fragment switchFragment; 

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

       fragmentManager = getSupportFragmentManager(); 

       switchFragment nameFragment = new SignNameFragment(); 
       fragmentManager.beginTransaction() 
        .add(R.layout.activity_sign_up, switchFragment) 
        .commit(); 


      } 

      public void cambiarFragment(){ 
       switchFragment = new anyTypeFragment(); 
       fragmentManager.beginTransaction() 
        .replace(R.layout.activity_sign_up, switchFragment) 
        .commit(); 
       } 
    } 

und die nameFragment Klasse:

public class nameFragment extends Fragment { 

    private Button next; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //Inicializar Modelo 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v= inflater.inflate(R.layout.nameFragment_fragment_layout,container,false); ///Cargar XML, Vista Padre, Si quiero dejarlo siempre 

     next=(Button)v.findViewById(R.id.btn_crear_grupo); 

     next.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

         ((SignUpActivity) getActivity()).cambiarFragment(); 
        } 


       } 
      }); 



     return v; 


    } 
} 

dort können Sie eine beliebige Fragment-Klasse erstellen Sie wollen.

+0

Erfordert die Ersetzung nicht einen ID-Typ? replace (int, Fragment) –

+0

Habe deine Lösung auch versucht, aber in meinem Fall nicht geholfen. Danke trotzdem, dass du geholfen hast. –

Verwandte Themen