Accéder à une méthode d'un Fragment de la ViewPager Activité
J'ai un Fragment avec une méthode setName() qui change un EditText texte, par le biais de la setText fonction.
Quel est le meilleur moyen pour appeler cette méthode à partir de l'activité qui héberge ce fragment par le biais d'un ViewPager?
En d'autres termes, comment puis-je accéder à un Fragment de méthodes (variation de ce fragment de la mise en page, par exemple) à partir de l'Activité des hôtes de fragment par le biais d'un ViewPager?
Je demande cela parce que j'ai essayé de plusieurs façons, mais toujours avec des erreurs.
- Vous pouvez essayer de créer une variable d'instance du Fragment avec le
setName()
méthode dans votre classe d'Activité. Attribuer à la variable pour le Fragment lors de l'instanciation. vous pouvez ensuite appelerfragment.setName()
de votre activité - J'ai ce problème, mais en l'appelant fragment.setName() par l'intermédiaire d'une référence stockée à elle, n'est pas le problème. Le problème est qu'à partir du fragment, la getActivity() renvoie la valeur nulle de sorte que les points de vue ne sont pas accessibles. Je peux accéder à la vue de l'activité, même si, et le fragment POURRAIT mettre des infos sur les points de vue appartenant à la fragment lors de la configuration. Mais plus tard, les getActivity() renvoie null et pourrait-il être quelque chose avec le viewPager la prise de contrôle de contexte, de sorte que getActivity est pas valide? Donc, il serait nécessaire de demander l'avis de la Viewpager? Je me suis même demandé.
Vous devez vous connecter pour publier un commentaire.
Je sais que c'est un peu tard, mais j'ai rencontré le même problème et peut-être que ça aidera d'autres personnes si vous avez déjà résolu.
Le premier problème que j'ai trouvé avec ViewPager est qu'il est presque impossible d'obtenir une référence à un fragment. Les fragments sont créés dynamiquement en getItem() et, par conséquent, vous ne pouvez pas définir un ID et ils sont automatiquement re-taged par le swicher, de sorte que vous ne pouvez pas trouver par la balise soit. Il existe quelques moyens pour le faire, mais elles sont toutes les solutions de contournement. (Mise à jour des données dans ListFragment dans le cadre de ViewPager)
La façon dont je l'ai résolu été en utilisant essentiellement un double Rappel. Fragment d'Une a une interface implémentée par la Principale Activité, l'Activité Principale dispose d'une interface implémentée par le Fragment B. Sur, par exemple, un bouton cliquer dans le Fragment A de la fonction de rappel dans l'Activité Principale est appelée, qui à son tour appelle la fonction de rappel du Fragment B. Regardez le code ci-dessous. J'espère que j'ai posté tout et il va vous aider. btw, je ne l'ai essayé avec un ViewPager, mais je suppose que ça marcherait avec n'importe quel type de Fragment de communication.
Principal Avtivity java:
Activité principale xml:
Fragment de java:
Fragment xml:
Fragment B De Java:
Fragment B xml:
Vous pouvez accéder à des méthodes publiques dans les fragments détenues par votre
ViewPager
. Vous devez soit (1) stocker une référence à laFragment
lorsque vous créez et l'ajouter à la liste qui sera de retour sur votre téléavertisseur ou l'adaptateur (2) vous devez obtenir une référence pour le fragment de la pager carte elle-même. Par exemple:Si votre méthode est
tout ce que vous avez à faire est d'appeler la méthode de la référence au fragment détenues par votre
ViewPager
Vous passez quels que soient les arguments que vous devez tout comme l'appel d'une méthode régulière. Notez que cela ne fonctionne si vous êtes l'appel d'une méthode à l'intérieur d'un fragment de son contenant
ViewPager
ouFragmentActivity
. Si vous souhaitez faire l'inverse, fragment de l'activité, vous devez utiliser une inerface.Fragment
Activité
Meilleure façon pour ce faire, il suffit d'appeler CallingFragmentName fragment = (CallingFragmentName) viewPager
.getAdapter()
.instantiateItem(viewPager, viewPager.getCurrentItem());
Il sera ré-instancier votre appel Fragment, de sorte qu'il ne sera pas jeter exception de pointeur null.