Ich möchte einer Aktivität ein Fragment hinzufügen, das ihr Layout programmgesteuert implementiert. Ich habe die Fragment-Dokumentation durchgesehen, aber es gibt nicht viele Beispiele, die beschreiben, was ich brauche. Hier ist die Art von Code, die ich zu schreiben versucht habe:
public class DebugExampleTwo extends Activity {
private ExampleTwoFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frame = new FrameLayout(this);
if (savedInstanceState == null) {
mFragment = new ExampleTwoFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(frame.getId(), mFragment).commit();
}
setContentView(frame);
}
}
...
public class ExampleTwoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
Button button = new Button(getActivity());
button.setText("Hello There");
return button;
}
}
Dieser Code wird kompiliert, stürzt jedoch beim Start ab, wahrscheinlich weil mein Code FragmentTransaction.add()
falsch ist. Was ist der richtige Weg, um dies zu tun?
quelle
ft.add(android.R.id.content, newFragment)
. Es ist nur erforderlich, ein benutzerdefiniertes Layout zu erstellen und seine ID festzulegen, wenn der Container des Fragments nicht die Inhaltsansicht der Aktivität ist.Folgendes habe ich mir ausgedacht, nachdem ich Tony Wongs Kommentar gelesen hatte :
...
...
Kotlin
Wenn Sie Kotlin verwenden, schauen Sie sich an, was die Kotlin-Erweiterungen von Google bieten, oder schreiben Sie einfach Ihre eigenen.
quelle
if (savedInstanceState == null)
vor der Fragmenterstellung oder nach dem Drehen eines Bildschirms, ob zwei Fragmente oder Fragmente neu angeordnet werden. Verwenden Sie überhaupt keineadd
Methode! Nurreplace
. Oder du wirst komisches Verhalten haben.backStackStateName
Zeichenfolge wird von Ihnen definiert.main.xml
quelle
Nachdem ich alle Antworten gelesen hatte, kam ich auf elegante Weise:
Grundsätzlich müssen Sie kein FrameLayout als Container Ihres Fragments hinzufügen, sondern können das Fragment direkt in den Android Root View-Container einfügen
WICHTIG: Verwenden Sie das Ersetzen von Fragmenten nicht wie die meisten der hier gezeigten Ansätze, es sei denn, es macht Ihnen nichts aus, den Instanzstatus der Fragmentvariablen während des Wiederherstellungsprozesses zu verlieren .
quelle
verwenden
quelle
Löst dieses Problem für API Level 17 oder höher
View.generateViewId()
. Die Dienstprogrammmethode stellt eine eindeutige ID bereit, die in der Erstellungszeit nicht verwendet wird.quelle
Zum programmgesteuerten Anhängen eines Fragments an eine Aktivität in Kotlin können Sie den folgenden Code anzeigen:
MainActivity.kt
activity_main.xml
FragmentName.kt
Wenn Sie mit Erweiterungen in Kotlin vertraut sind , können Sie diesen Code noch verbessern, indem Sie diesem Artikel folgen .
quelle