Je souhaite afficher une boîte de dialogue d'alerte dans mon application. J'utilise des fragments. J'ai essayé le code ci-dessous pour le faire:
AlertDialog ad = new AlertDialog.Builder(context)
.create();
ad.setCancelable(false);
ad.setTitle(title);
ad.setMessage(message);
ad.setButton(context.getString(R.string.ok_text), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
ad.show();
mais il se bloquait et l'erreur dans logcat était:
04-18 15: 23: 01.770: E/AndroidRuntime (9424): Android.view.WindowManager $ BadTokenException: Impossible d'ajouter une fenêtre - le jeton null n'est pas pour une application
D'Internet, j'ai appris que l'accident était dû à un problème de contexte. J'avais donné le contexte comme
context = this.getActivity().getApplicationContext();
Je ne sais pas quel est le problème avec cela. Quelqu'un peut-il m'aider?
Remplacez context
par getActivity()
.
Le ApplicationContext
ne doit pas être utilisé pour des tâches telles que la création de dialogues. Comme vous êtes dans un fragment, vous pouvez plutôt obtenir le contexte d’activité en appelant simplement la méthode Fragments getActivity()
.
Plus d'informations sur cette question (AlertDialog dans un fragment, géré dans un événement):
Si vous appelez AlertDialog dans le cadre d’un événement tel que onClick (View v) ou onLongClick (View v), vous pouvez utiliser
public boolean onClick(View v) {
...
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext());
...
}
Essayez d’utiliser DialogFragment, DialogFragment est préférable lorsque vous utilisez des fragments.
J'ai eu des problèmes similaires dans lesquels j'essayais de créer un AlertDialog à partir d'un fragment. Une exception NullPointerException en est issue. Au début, j'ai fait ce qui suit:
AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();
La NullPointerException
s'est produite spécifiquement lors de l'appel de alertDialog.show()
ultérieurement dans le code. Mais après avoir recherché dans la documentation AlertDialog.Builder()
, il semblait y avoir un autre moyen de l'initialiser [AlertDialog.Builder Doc] , qui consiste à inclure un thème/resId comme indiqué ci-dessous:
AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create();
Ceci a résolu le NullPointerException
à portée de main. J'espère que cela vous aide aussi!
Je l'ai utilisé dans un adaptateur à l'intérieur d'un listView, donc je ne pouvais pas utiliser getActivity()
. Afin de le faire fonctionner, j'ai utilisé getActivity()
pour le contexte dans l'instanciation de l'adaptateur dans le fragment:
this.adapter = new myAdapter(getActivity(), factory);
Plus tard dans l'autre classe (la classe de l'adaptateur), j'ai pu utiliser getContext()
et cela a fonctionné.