Android Fragment getActivity () = null

J'utilise des fragments dans ma demande. Et le problème très fréquent pendant leur utilisation est le NPE lors de l'utilisation de getActivity (). Je sais que nous pouvons le résoudre en vérifiant si getActivity() != null chaque fois ou en vérifiant si le fragment est isAdded() .

Dans une de mes classes, j'ai un contexte d'activité dans plus de 60 endroits. Vérifier si getActivity () n'est pas nulle ou si le fragment est encore ajouté à l'activité dans tous les endroits rend le code laid, plus grand et non maintenable. Y a-t-il une autre façon de gérer cela? Est-il même possible de détruire le fragment (et d'arrêter tout travail qu'il a fait en étant enlevé) quand il est retiré de l'activité?

  • Utiliser un nouveau sbb de firebase dans le projet d'eclipse Android
  • Comment importer RecyclerView pour Android L-preview
  • Quel regex peut être utilisé pour filtrer dalvikvm ET les messages dalvikvm-heap du logcat
  • Android: modification de la vue principale d'un bouton
  • LocationServices.SettingsApi Réinitialiser SETTINGS_CHANGE_UNAVAILABLE drapeau
  • Toast versus Dialog boxes: à utiliser quand?
  • Aussi Est-ce que cela est suggéré?

  • Changer la couleur du texte de la barre d'état lorsque PrimaryDark est blanc
  • Android: qu'est-ce qui est mieux: plusieurs activités ou la commutation de vues manuellement?
  • TextView onClick () ne fonctionne pas
  • Appel téléphonique après l'exécution du rendu de la mise en page?
  • Pourquoi y at-il des pixels supplémentaires autour de mon Android GridView?
  • Où se trouve l'emplacement du fichier créé par Cordova File Plugin?
  • 5 Solutions collect form web for “Android Fragment getActivity () = null”

    Selon mon expérience, la plupart des cas de getActivity () renvois sont en rappel asynchrone.

    Par exemple, votre fragment déclenche un AsyncTask, puis il est supprimé avant que le travail d'arrière-plan ne soit terminé, puis lorsque la tâche d'arrière-plan finit et appelle getActivity () dans onPostExecute (), il obtiendra un nul puisque le fragment est déjà détaché du activité.

    Ma solution:

    1.Vérifiez getActivity () == null au début de chaque rappel asynchrone, si c'est le cas, il suffit d'interrompre la méthode.

    2. Annuler les travaux asynchrones dans onDetach ().

    Et je pense que c'est une meilleure solution que la sauvegarde de l'instance d'activité sur OnTtach () car, comme votre fragment est supprimé, pourquoi ne pas faire tous les travaux laissés dans les rappels (dans la plupart des cas, les codes UI)?

    GetActivity sera réintégrée dans method – onActivityCreated ().

    Il est donc plus sûr d'appeler getActivity () juste après onActivityCreated () (selon le cycle de vie des fragments http://developer.android.com/guide/components/fragments.html ) – par exemple dans onStart () – dans ce cas, c'est WILL N'EST JAMAIS NULL – pas besoin de faire des contrôles inutiles comme isAdded et getActivity! = Null.

    PS Si nous utilisons cette solution:

     @Override public void onAttach(Activity activity) { super.onAttach(activity); mActivity = activity; } 

    La mActivité ne sera jamais nulle, mais plus tard dans la méthode onActivityCreated () getActivity () est devenu différent avec mActivity. Mon opinion – sûr que nous pouvons enregistrer toute l'activité en variable, mais il est plus sûr de suivre le flux de travail du cycle de vie des fragments d'Android et d'obtenir une activité juste après onActivityCreated ()

    Je pense que vous devriez utiliser la méthode onAttach(Activity) du Fragment .

    Je pense que cela devrait vous aider à éviter tous ces NPE.

    Ma solution remplace la méthode onSaveInstanceState dans BaseActivity:

     @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //solution of fragment.getActivity() is null outState.remove("android:support:fragments"); } 

    Je n'ai pas trouvé de solution à cela, peut-être parce que si vous pensez au cycle de vie d'un fragment, vous devriez comprendre quand vous avez vérifié la valeur nulle.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.