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é?

  • Liste complète des codes d'erreur MediaPlayer
  • Comment un fichier json peut-il lire dans Android en utilisant les frameworks ioniques et angulaires?
  • ParseSdkContent failed Impossible d'initialiser la classe android.graphics.Typeface
  • Android AppCompat ProgressDialog?
  • Android: changement du champ final statique privé à l'aide de la réflexion java
  • Android M + Retrofit + JSON: impossible de rendre accessible le constructeur de terrain
  • Aussi Est-ce que cela est suggéré?

  • Service persistant
  • Dans un TextView Android, est-il possible d'insérer des paragraphes?
  • Comment éviter un Toast s'il y a un Toast déjà montré
  • Http Détruit avec le corps
  • La géolocalisation Phonegap ne fonctionne parfois pas sur Android
  • Quelle est la liste des langues / paramètres pris en charge sur Android?
  • 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.