Une classe DialogFragment interne doit-elle être statique ou non?
Ceci est un extrait de code de mon projet que je suis en utilisant pour en savoir Android:
private void enableLocationSettings() {
Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(settingsIntent);
}
@SuppressLint("ValidFragment")
public class EnableGpsDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setTitle("Tytuł")
.setMessage("wiadomosc")
.setPositiveButton("odpal", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
enableLocationSettings();
}
})
.create();
}
}
Comme vous pouvez le voir, je dois ajouter que @SuppressLint
pour rendre mon application fonctionne mais sur le guide cette annotation n'était pas nécessaire.
Ce que je fais mal?
Voici mon importations:
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.DialogFragment;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.ToggleButton;
source d'informationauteur szpic
Vous devez vous connecter pour publier un commentaire.
L'exemple n'ont pas de ces annotations parce que la classe est dans son propre fichier. Cela signifie qu'il est indépendant de l'Activité qui utilise le Fragment.
Dans votre cas, votre Fragment est à l'intérieur d'une Activité et ne pas utiliser le modificateur static. Cela signifie qu'il est lié à l'Activité de l'instance.
Avoir le Fragment dépendent de l'Activité de l'instance est une mauvaise idée, ces deux classes ont des complexes lifecyles (surtout depuis que les Activités se détruit et recréé assez souvent) et doivent être indépendants les uns des autres.
Vous aurez besoin de faire
EnableGpsDialogFragment
's modificateurstatic
.Un
static
classe ne dépend pas de la classe englobante' instance, de sorte que le témoin s'en aller.Pour plus d'informations, lire le Java tutoriel sur la classes imbriquées.
Modifier en réponse à votre edit:
Maintenant que les classes ne dépendent pas les uns des autres cas, vous devrez obtenir une instance de
YourActivity
de sorte que vous pouvez appelerenabledLocationSettings()
une façon est par moulage et ne fonctionnera que siEnableGpsDialogFragment
n'est utilisé que parYourActivity
:à
Si ce Fragment sera utilisé par plusieurs Activités, vous devez créer un
interface
pour être mis en œuvre par chaque Activité en lieu et place.Tous DialogFragments doit être publique et si un intérieur de classe statique. Ils doivent également avoir un public de non-arg constructeur, et ne comptent que sur setArguments() pour la transmission de paramètres.
Défaut de se conformer à ce qui a depuis quelques temps un produit de la Charpie avertissement, que vous pouvez supprimer si tu le voulais vraiment, mais à partir de l'Android support library v25 et, vous obtenez en fait une exception si en essayant de montrer un DialogFragment qui n'est pas conforme à ces règles:
java.lang.IllegalStateException: Fragment TestActivity$TestDialogFrament must be a public static class to be properly recreated from instance state.
La raison en est, comme l'a déclaré, que le système d'exploitation doit être en mesure de recréer tous les fragments dans le cas où quelque chose comme une situation d'insuffisance de mémoire forces pour détruire des fragments lorsqu'une application est mise en arrière-plan. Lorsque l'application est de mettre au premier plan à nouveau, les fragments devrait être possible de re-créer à partir de la sérialisé l'état de l'application, et ce n'est pas possible pour les non-statique à l'intérieur d'une classe autre que d'une instance de l'enfermant extérieur de la classe, et la re-création n'est pas fait à partir de ce contexte.
Malheureusement, cela rend les choses plus complexes pour les dialogues, car, en général, très pratique pour créer un anonyme sous-classe qui remplace onCreateDialog. Cependant, un tel dialogue ne serait pas en mesure de re-créer.
Il ne devrait pas être !
De mon point de vue, je ne veux pas que mon DialogFragment (votre NetworkConnectionError) à être statique parce que je veux être en mesure d'appeler des variables ou des méthodes de ma classe conteneur (Activité).
Afin de ne pas être statique.
Mais je ne veux pas générer memoryLeaks ni.
Quelle est donc la solution ?
Simple, lorsque vous vous rendez dans onStop, assurez-vous que vous tuez votre DialogFragment, c'est aussi simple que cela.
Donc, le code ressemble à quelque chose comme ça:
Et de cette façon, vous éviter les fuites de mémoire (parce que c'est mauvais) et vous assurer de ne pas avoir un putain de statique fragment qui ne peuvent pas accéder à votre activité les champs et les méthodes.
Ce est la bonne façon de traiter ce problème, de mon point de vue.