J'essaie de créer une ImageView dans un fragment qui fera référence à l'élément ImageView que j'ai créé dans le XML pour le fragment. Cependant, la findViewById
méthode ne fonctionne que si j'étends une classe Activity. Y a-t-il une façon dont je peux également l'utiliser dans Fragment?
public class TestClass extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ImageView imageView = (ImageView)findViewById(R.id.my_image);
return inflater.inflate(R.layout.testclassfragment, container, false);
}
}
La findViewById
méthode contient une erreur qui indique que la méthode n'est pas définie.
Réponses:
Utilisez getView () ou le paramètre View de l'implémentation de la
onViewCreated
méthode. Il renvoie la vue racine du fragment (celle renvoyée par laonCreateView()
méthode) . Avec cela, vous pouvez appelerfindViewById()
.Comme cela
getView()
ne fonctionne qu'aprèsonCreateView()
, vous ne pouvez pas l'utiliser à l'intérieuronCreate()
ni dans lesonCreateView()
méthodes du fragment.la source
ImageView
provient de la disposition gonflée - voir ma réponse pour plus de détails. Sinon, onCreateView est le bon endroit pour le faire @ N-AccessDevonActivityCreated()
c'est l'endroit recommandé pour rechercher et stocker des références à vos vues. Vous devez nettoyer ces références stockées en les redéfinissantnull
dansonDestroyView()
ou vous fuirez leActivity
.Vous devez gonfler la vue du fragment et appeler
findViewById()
leView
retour.la source
NullPointerException
.Dans la
Fragment
classe, vous obtiendrez la méthode de remplacement onViewCreated () où vous devriez toujours initialiser vos vues car dans cette méthode, vous obtenez un objet de vue à l'aide duquel vous pouvez trouver vos vues comme:Rappelez-vous toujours qu'en cas de Fragment, cette
onViewCreated()
méthode ne sera pas appelée automatiquement si vous retournez null ousuper.onCreateView()
fromonCreateView()
method. Il sera appelé par défaut en cas deListFragment
commeListFragment
retourFrameLayout
par défaut.Remarque: vous pouvez obtenir la vue fragmentée n'importe où dans la classe en utilisant
getView()
une fois qu'elleonCreateView()
a été exécutée avec succès. c'est à direla source
view
passé àonViewCreated
provoque toujoursNullPointerException
mais l'utilisationgetActivity()
est très bien. Des idées pourquoi?onCreateView
méthode. Je viens de déboguer et il s'avère qu'il y a une mise en page (dans mon casFrameLayout
). Cela étant dit, lorsque j'essaie de trouver un élément, il revientnull
. Pourquoi cela se produit-il?Je me rends compte que c'est une vieille question, mais la réponse dominante laisse à désirer.
La question n'est pas claire de ce qui est requis de
imageView
- est-ce que nous le repassons comme vue, ou simplement conservons-nous une référence pour plus tard?Quoi qu'il en soit, si le
ImageView
provient de la disposition gonflée, la bonne façon de le faire serait:la source
Obtenez d'abord la vue fragmentée puis récupérez à partir de cette vue votre ImageView.
la source
Vous pouvez également le faire dans la
onActivityCreated
méthode.Comme ils le font ici: http://developer.android.com/reference/android/app/Fragment.html (déconseillé au niveau 28 de l'API)
et
sont possibles.
la source
getView()
donnera la vue racinela source
Vous pouvez remplacer onViewCreated () qui est appelé juste après que toutes les vues ont été gonflées. C'est le bon endroit pour remplir les
View
variables membres de votre fragment . Voici un exemple:la source
À l'intérieur de la
Fragment
classe, nous obtenons uneonViewCreated()
méthode de remplacement où nous devons toujours initialiser nos vues car dans cette méthode, nous obtenons unview
objet. En utilisant cet objet, nous pouvons trouver nos vues comme ci-dessous:la source
La méthode getView () ne fonctionnera pas sur les fragments en dehors d'OnCreate et des méthodes similaires.
Vous avez deux façons, passez la vue à la fonction sur le oncreate (ce qui signifie que vous ne pouvez exécuter vos fonctions que lorsque la vue est en cours de création) ou définissez la vue en tant que variable:
la source
1) gonflez d'abord la disposition de Fragment, puis vous pouvez utiliser findviewbyId.
la source
la source
Utilisation
ça va marcher
la source
a accepté d'appeler
findViewById()
le point de vue.la source
Remarque :
À partir du niveau 26 de l'API, vous n'avez pas non plus besoin de transtyper spécifiquement le résultat de findViewById car il utilise l'inférence pour son type de retour.
Alors maintenant, vous pouvez simplement le faire,
la source
Selon la documentation sur l'API niveau 11
Référence, dans Back Stack http://developer.android.com/reference/android/app/Fragment.html
petit code
la source
En utilisant
getView()
renvoie la vue du fragment, vous pouvez appelerfindViewById()
pour accéder à n'importe quel élément de vue dans la vue de fragment.la source
Essayez ça ça marche pour moi
la source
La meilleure façon de mettre en œuvre cela est la suivante:
De cette façon, le rootView peut être utilisé pour chaque contrôle défini dans la disposition xml et le code est beaucoup plus propre de cette façon.
J'espère que cela t'aides :)
la source
1) Déclarez votre fichier de mise en page.
2) Ensuite, obtenez l'identifiant de votre vue
la source
Utilisez le plugin squelette gradle , il générera automatiquement les classes de détenteurs de vues avec la référence à votre mise en page.
En supposant maintenant que vous aviez un
ImageView
déclaré dans votremy_layout.xml
fichier, il générera automatiquement la classe myLayout pour vous.la source
Essaye ça:
la source
essayer
la source
getView()
plus tardVous pouvez appeler
findViewById()
avec l' objet d'activité que vous obtenez dans votrepublic void onAttach(Activity activity)
méthode à l'intérieur de votre fragment.Enregistrez l'activité dans une variable par exemple:
Dans la classe Fragment :
private Activity mainActivity;
Dans laonAttach()
méthode:this.mainActivity=activity;
Enfin, exécutez chaque findViewById via le vairable:
mainActivity.findViewById(R.id.TextView);
la source
Il existe une autre méthode appelée onViewCreated.
la source
À l'intérieur de la méthode onCreateView
1) vous devez d'abord gonfler la disposition / vue que vous souhaitez ajouter, par exemple. Disposition linéaire
2) Ensuite, vous pouvez trouver votre identifiant imageView à partir de la mise en page
3) renvoyer la disposition gonflée
la source
Vous devez gonfler la vue
la source
Dans les fragments, nous avons besoin d'une vue de cette fenêtre afin de faire une onCreateView de ce fragment.
Obtenez ensuite la vue et utilisez-la pour accéder à chaque identifiant de vue de ces éléments de vue.
la source
Le gonfleur de disposition entre en photo ici. L'inflateur de mise en page est une classe qui nous permet d'utiliser les vues XML dans le code java. Vous pouvez donc gonfler la vue xml racine dans la variable v avec le code suivant. Et puis, en utilisant v, vous pouvez trouver les vues enfant de la vue racine v.
la source
La façon la plus simple d'utiliser de telles choses est d'utiliser butterknife. Par cela, vous pouvez ajouter autant d'Onclciklisteners que par @OnClick () comme décrit ci-dessous:
la source