Je veux ajouter un fragment à une activité qui implémente sa mise en page par programme. J'ai parcouru la documentation Fragment mais il n'y a pas beaucoup d'exemples décrivant ce dont j'ai besoin. Voici le type de code que j'ai essayé d'écrire:
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;
}
}
Ce code se compile mais se bloque au démarrage, probablement parce que my FragmentTransaction.add()
est incorrect. Quelle est la bonne façon de procéder?
ft.add(android.R.id.content, newFragment)
. Il est uniquement nécessaire de créer une mise en page personnalisée et de définir son identifiant si le conteneur du fragment n'est pas la vue de contenu de l'activité.Voici ce que j'ai trouvé après avoir lu le commentaire de Tony Wong :
...
...
Kotlin
Si vous utilisez Kotlin, assurez-vous de regarder ce que les extensions Kotlin de Google fournissent ou écrivez simplement la vôtre.
la source
if (savedInstanceState == null)
avant la création du fragment, ou après avoir fait pivoter un écran, vous aurez deux fragments ou des fragments réorganisés. N'utilisez pas du tout laadd
méthode! Seulementreplace
. Ou vous aurez un comportement étrange.backStackStateName
chaîne est quelque chose que vous définissez.main.xml
la source
Après avoir lu toutes les réponses, j'ai trouvé une manière élégante:
Fondamentalement, vous n'avez pas besoin d'ajouter un frameLayout comme conteneur de votre fragment à la place, vous pouvez ajouter directement le fragment dans le conteneur racine Android View
IMPORTANT: n'utilisez pas replace fragment comme la plupart des approches présentées ici, sauf si cela ne vous dérange pas de perdre l'état d'instance variable de fragment pendant le processus de recréation .
la source
utilisation
la source
Pour le niveau d'API 17 ou supérieur,
View.generateViewId()
résoudra ce problème. La méthode utilitaire fournit un identifiant unique qui n'est pas utilisé lors de la génération.la source
Pour attacher un fragment à une activité par programme dans Kotlin, vous pouvez consulter le code suivant:
MainActivity.kt
activity_main.xml
FragmentName.kt
Si vous connaissez les extensions de Kotlin, vous pouvez encore améliorer ce code en suivant cet article.
la source