208 votes

getActivity() retourne la valeur null en fonction du Fragment

J’ai un fragment (F1) avec une méthode publique comme ceci

et oui quand je l’appelle (à partir de l’activité) c’est null...

Il doit être quelque chose que je fais très mal, mais je ne sais pas ce qui est qui

172voto

PJL Points 5865

'commit' horaires de la transaction, c'est à dire que ça n'arrive pas, d'emblée, mais il est prévu que les travaux sur le thread principal la prochaine fois que le thread principal est prêt.

Je suggère l'ajout d'un

onAttach(Activity activity)

méthode de fragment et de mettre un point d'arrêt sur elle et de voir quand il est appelé par rapport à votre appel à " tsa()'. Vous verrez qu'elle est appelée après la méthode où vous faites l'appel à la " tsa()' sorties. Le "onAttach' appel est où le fragment est attachée à son activité et à partir de ce point getActivity() va retourner une valeur non-nulle (nb il y a aussi un onDetach() l'appel).

97voto

Pawan M Points 4396

Le meilleur pour se débarrasser de cela est de garder ACTIVITE référence lorsque onAttach est appelé et utiliser la référence de l’activité dans la mesure nécessaire, pour par exemple

10voto

zajac.m2 Points 348

PJL est droit. J'ai utilisé sa suggestion, et c'est ce que j'ai fait:

  1. défini des variables globales pour fragment:

    private final Object attachingActivityLock = new Object();

    private boolean syncVariable = false;

  2. mise en œuvre

@Override
public void onAttach(Activity activity) {
  super.onAttach(activity);
  synchronized (attachingActivityLock) {
      syncVariable = true;
      attachingActivityLock.notifyAll();
  }
}

3 . J'ai enveloppé ma fonction, où j'ai besoin d'appeler getActivity(), dans le thread, parce que si il aurait exécuté sur le thread principal, je voudrais bloquer le thread à l'étape 4. et onAttach() ne sera jamais appelé.

    Thread processImage = new Thread(new Runnable() {

        @Override
        public void run() {
            processImage();
        }
    });
    processImage.start();

4 . dans ma fonction de là où j'ai besoin d'appeler getActivity(), j'utilise ce (avant l'appel getActivity())

    synchronized (attachingActivityLock) {
        while(!syncVariable){
            try {
                attachingActivityLock.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

Si vous avez quelques mises à jour de l'INTERFACE utilisateur, n'oubliez pas de les exécuter sur le thread de l'INTERFACE utilisateur. J'ai besoin de mettre à jour ImgeView j'ai donc fait:

image.post(new Runnable() {

    @Override
    public void run() {
        image.setImageBitmap(imageToShow);
    }
});

7voto

Andrew Points 1532

L'ordre dans lequel les fonctions sont appelées après commit():

  1. Quelle que soit la méthode que vous appelez manuellement à droite après le commit()
  2. onAttach()
  3. onCreateView()
  4. onActivityCreated()

J'avais besoin de faire un peu de travail qui a impliqué certains points de Vue, de sorte onAttach() ne fonctionne pas pour moi; il s'est écrasé. Donc je l'ai déplacé une partie de mon code qui a été à la définition de certains paramètres à l'intérieur d'une méthode appelée juste après commit() (1.), puis l'autre partie du code qui s'occupait de vue à l'intérieur de onCreateView() (3.).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X