Hey Zusammen,
ich bin gerade dabei ein "Testspiel" mit Fragmenten zu basteln
um dass ganze mal etwas besser kennenzulernen usw.
Da ich mich damit so nicht so richtig auskenne, komme ich gerade nicht so richtig weiter und habe hierzu ein paar Fragen.
Wie genau läuft es mit dem FragmentManager? Wird dieser nur einmal in der Main erstellt und ich kann immer auf diesen zugreifen, oder muss ich diesen quasi für jedes Fragment neu erstellen?
Momentan sieht es bei mir wie folgt aus, ich habe folgende Klassen:
- MainActivity
- StartFragment
- GameFragment
- GameOverFragment
- HighscoreFragment
In der MainActivity (hier ist auch das FrameLayout "container" gesetzt) steht drin:
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
private StartFragment startFragment;
private GameFragment gameFragment;
private HighscoreFragment highscoreFragment;
private GameOverFragment gameOverFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startFragment = (StartFragment) Fragment.instantiate(this, StartFragment.class.getName(),null);
gameFragment = (GameFragment) Fragment.instantiate(this, GameFragment.class.getName(),null);
highscoreFragment = (HighscoreFragment) Fragment.instantiate(this, HighscoreFragment.class.getName(), null);
gameOverFragment = (GameOverFragment) Fragment.instantiate(this, GameOverFragment.class.getName(),null);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.container, startFragment);
fragmentTransaction.commit();
}
}
Alles anzeigen
Hier wird gleich das StartFragment (mit einem Menü) angezeigt.
StartFragment
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class StartFragment extends Fragment implements View.OnClickListener {
private TextView view_title, btnStart, btnHighscore, btnQuit;
Fragment gameFragment = new GameFragment();
FragmentManager fm = getFragmentManager();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragment_start, null);
view_title = layout.findViewById(R.id.view_title_menu);
btnStart = layout.findViewById(R.id.btn_start);
btnHighscore = layout.findViewById(R.id.btn_highscore);
btnQuit = layout.findViewById(R.id.btn_quit);
return layout;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
btnStart = getActivity().findViewById(R.id.btn_start);
btnStart.setOnClickListener(this);
btnQuit = getActivity().findViewById(R.id.btn_quit);
btnQuit.setOnClickListener(this);
btnHighscore.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.findViewById(R.id.container) == null){
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.container, Fragment.instantiate(this,GameFragment.class.getName()));
fragmentTransaction.setTransition(fragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
if (v.getId() == R.id.btn_start){
} else if (v.getId() == R.id.btn_highscore){
} else if (v.getId() == R.id.btn_quit){
System.exit(0);
}
}
}
Alles anzeigen
Dass hier im StartFragment ist der letzte Code den ich getestet habe - und welcher natürlich auch nicht funktioniert -
Gebe ich in der MainActivity unter onCreate alle Fragmente an, legt er mir diese alle übereinander und man sieht alles auf einmal.
Naja, wie dem auch sein ist dies hier erstmal nur "rumgespiele", also zerreißt mich bitte nicht gleich
Meine Frage nun, wie bekomme ich ein neues Fragment angezeigt (ohne dass das alte durchschimmert), wenn ich z.B. auf den START-BUTTON drücke?
Ich habe das Prinzip bzw. die genaue Funktion des Managers noch nicht so richtig verstanden. Vllt. kann mir dass ja mal einer für Blöde erklären
Vielen Dank im voraus.
P.S. Der Code wird zu 100% nicht korrekt sein, und garantiert optimierungsfähig sein, aber wie gesagt, ICH lerne noch Selbstverständlich freue ich mich über jeden Ratschlag/Tipp oder Trick
EDIT:
Ich habe gerade nochmal ausprobiert und getestet. Habe folgendes im onClickListener eingefügt,
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
GameFragment fragment = new GameFragment();
fragmentTransaction.replace(R.id.container, fragment);
fragmentTransaction.commit();
und NUN wird gewechselt. So habe ich mir dass gedacht. Nun kann ich weiterspielen
P.P.S Gerne kann mir aber noch einer erklären (immer noch für Blöde ) wie der dass so abläuft mit Fragmenten bzw. dem Manager