Ich versuche eine App zu erstellen, die einen Master-/Detailfluss mit Fragmenten hat. Wenn Sie ein Objekt auswählen, öffnet sich ein Detailfragment, das dann ein anderes Fragment "öffnen" und zum hinteren Stapel hinzufügen kann.Umschalten von Fragmenten im Master-/Detailfluss
Ich habe Klassen umbenannt, um zu veranschaulichen, was sie tun.
public class ListOfDetails extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
}
//Callback method indicating that an item with the given ID was selected.
public void onItemSelected(String id) {
// Performing logic to determine what fragment to start omitted
if (ifTwoPanes()) {
Fragment fragment = new DetailFragmentType1();
getSupportFragmentManager().beginTransaction().replace(R.id.aContainer, fragment).commit();
} else {
Intent newIntent = new Intent(this, SinglePaneFragmentWrapper.class);
newIntent.putExtra("id", id);
startActivity(newIntent);
}
}
// My attempt at making it possible to change displayed fragment from within fragments
public void changeDetailFragment(Fragment fragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
transaction.replace(R.id.aContainer, fragment);
transaction.commit();
}
}
Ein Beispiel für eines der Detailfragmente. Es gibt viele verschiedene Fragmente, die unter verschiedenen Umständen erstellt werden können.
public class DetailFragmentType1 extends Fragment {
private ListOfDetails parent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Activity a = getActivity();
if (a instanceof ListOfDetails) {
parent = (ListOfDetails) a;
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Button aButton = (Button) getActivity().findViewById(R.id.aButton);
aButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
parent.changeDetailFragment(new SubDetailFragment());
}
});
}
}
Wenn am Telefon ist eine Wrapper-Aktivität verwendet, um das Fragment zu halten
public class SinglePaneFragmentWrapper extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Duplicate logic must be performed to start fragment
// Performing logic to determine what fragment to start omitted
String id = getIntent().getStringExtra("id");
if(id == "DetailFragmentType1") {
Fragment fragment = new DetailFragmentType1();
getSupportFragmentManager().beginTransaction().replace(R.id.aContainer, fragment).commit();
} else {
...
}
}
}
Was ist der richtige Weg ist, um das Fragment zu ändern, die im Detailbereich unter diesen Umständen geöffnet ist? Meine Methode fühlt sich an wie ein Hack bei Verwendung von zwei Fensterbereichen und funktioniert nicht einmal, wenn nur ein Fensterbereich verwendet wird, da getParent()
von SinglePaneFragmentWrapper null zurückgibt, was es mir unmöglich macht, parent.changeDetailFragment()
aufzurufen.
Dies ist eine komplizierte Frage, hoffentlich habe ich es gut erklärt. Lass es mich wissen, wenn ich etwas verpasst habe. Danke