Comment puis-je ajouter un Fragment d'une Activité avec un créé par programme à la vue de contenu
Je veux ajouter un Fragment d'une Activité qui met en œuvre sa disposition par programmation. J'ai regardé sur le Fragment de la documentation, 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 compile mais se bloque au démarrage, sans doute parce que mon FragmentTransaction.add()
est incorrect. Quelle est la bonne façon de le faire?
Vous devez vous connecter pour publier un commentaire.
Il y en a plus d'un problème avec ce code. Un fragment ne peut être déclaré de cette façon, à l'intérieur du même fichier java comme l'activité, mais pas comme un public à l'intérieur de la classe. Le cadre prévoit le fragment du constructeur (sans paramètres) pour être visible et publique. Le déplacement du fragment dans l'Activité interne de la classe, ou la création d'un nouveau fichier java pour le fragment correctifs.
Le deuxième problème est que lorsque vous avez ajout d'un fragment de cette façon, vous devez passer une référence au fragment contenant la vue, et de ce point de vue doit avoir un identifiant personnalisé. À l'aide de l'id par défaut sera le plantage de l'application. Voici le code mis à jour:
ft.add(android.R.id.content, newFragment)
. Il est seulement nécessaire de créer une mise en page personnalisée et l'établissement de ses id si le fragment du conteneur n'est pas l'activité de l'affichage du contenu.android.R.id.content
? À partir de la doc (developer.android.com/reference/android/app/...), mais il est spécifié: "en Option identifiant du conteneur de ce fragment est placé dans. Si 0, il ne sera pas placé dans un conteneur.". Je ne vois pas où ceandroid.R.id.content
est à venir à partir de...android.R.id.content
en regardant le code source Android. Il me semble que c'est la valeur par défaut de l'id qu'ils utilisent dans quelques endroits.generateViewID
méthode? J'ai un crash car il ne trouve pas la vue avec un ID généré. En essayant de comprendre plus...generateViewID
car il est uniquement disponible dans l'API de 17 et les plus récents. Quand j'ai écrit la question de l'API 11 était disponible.Voici ce que j'ai trouvé après la lecture de Tony Wong commentaire:
...
...
Kotlin
Si vous utilisez Kotlin assurez-vous de jeter un oeil à ce que le Kotlin extensions par Google ou tout simplement écrire votre propre.
if (savedInstanceState == null)
avant fragment de la création, ou après la rotation d'un écran, vous aurez deux fragments, des fragments de réorganisation. Ne pas utiliseradd
méthode à tous! Seulementreplace
. Ou vous allez avoir des comportements bizarres.main.xml
Après avoir lu toutes les Réponses que j'ai trouvées de manière élégante:
fondamentalement, vous n'avez pas besoin d'ajouter un frameLayout comme votre contenant de fragment au lieu de cela, vous pouvez ajouter directement le fragment dans le root android Vue conteneur
IMPORTANT: n'utilisez pas de remplacer le fragment comme la plupart de l'approche présentée ici, à moins que vous ne me dérange pas de perdre du fragment variable d'état de l'instance au cours de onrecreation processus.
utilisation
Pour API de niveau 17 ou plus,
Afficher.generateViewId()
permettra de résoudre ce problème. L'utilité de la méthode fournit un identifiant unique qui n'est pas utilisé dans la construction.