67

I want to display an alert dialog in my app. I am using fragments. I tried the below code to do this:

 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();

but it was crashing and the error in logcat was:

04-18 15:23:01.770: E/AndroidRuntime(9424): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

From internet I came to know that the crash is due to context issue. I had given context as

context = this.getActivity().getApplicationContext();

I don't know what is the problem with this. Can anybody help me?

Waldmann
  • 1,563
  • 12
  • 25
andro-girl
  • 7,989
  • 22
  • 71
  • 94

9 Answers9

137

Replace context with getActivity().

The ApplicationContext should not be used for tasks such as creating Dialogs. As you are in a fragment you can instead get the Activity-Context simply by calling the Fragments getActivity() method.

Jave
  • 31,598
  • 14
  • 77
  • 90
  • 4
    What should do if getActivity() is null? – Sujith Thankachan Mar 17 '14 at 12:10
  • 2
    @SujithPt When `getActivity()` returns null, it means that the fragment is not attached to the activity and you should not show any dialogs. – Mousa Dec 08 '15 at 08:45
  • @SujithThankachan you can wait till the getActivity() is not null. I havenot tried it out though. – Sreekanth Karumanaghat May 03 '18 at 05:18
  • requireActivity() new method was added in [february 2018](https://developer.android.com/topic/libraries/support-library/revisions#27-1-0) which in case it return null it throws an exception. If you are sure this method will not return null because you are using between onAttach and onDetach you can use it to get ride ot the warning that getActivity() might return null. – Soon Santos Sep 02 '18 at 21:54
16

More Information about this question (AlertDialog in a fragment, managed inside an event):

If you call AlertDialog within an event like onClick(View v) or onLongClick(View v) you can use

public boolean onClick(View v) {
    ...
    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext());
    ...
}
JDCoder
  • 541
  • 6
  • 9
10

Try to use DialogFragment, DialogFragment is better when you use Fragments

FUBUs
  • 617
  • 5
  • 9
1

I have had similar issues whereby I was trying to create an AlertDialog from a Fragment. A NullPointerException arose from it. Initially I did as follows:

AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();

The NullPointerException occurred specifically when calling alertDialog.show() later on in the code. But after searching the documentation for AlertDialog.Builder(), there seemed to be another way to initialize it [AlertDialog.Builder Doc], which is to include a theme/resId as shown below:

AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create();

This resolved the NullPointerException at hand. Hope this helps you as well!

Syuqri
  • 86
  • 1
  • 6
0

I used it in an adapter inside a listView, therefore I couldn't use getActivity(). In order to make it work I used getActivity() for the context in the instantiation of the adapter in the fragment:

this.adapter = new myAdapter(getActivity(), factory);

Later in the other class (the adapter's class) I was able to use getContext()and it worked.

Hanan N
  • 51
  • 1
  • 4
0

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

G.ONE
  • 507
  • 1
  • 5
  • 14
-1
                       AlertDialog alert= null;
                        AlertDialog.Builder build= new AlertDialog.Builder(getActivity());
                        build.setTitle("title");
                        build.setItems(stringarrayname, new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                            //Toast.makeText(getActivity(), "hi", Toast.LENGTH_SHORT).show();   

                            }
                        });
                        build.create().show();
Ashish Dwivedi
  • 8,048
  • 5
  • 58
  • 78
-1

You can try this or use DialogFragment

private void showAlert(final int position) {
        new AlertDialog.Builder(getActivity().getApplicationContext())
                .setTitle("Delete entry")
                .setMessage("Are you sure you want to delete this entry?")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                      //  deleteSuggestions(position);
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // do nothing
                    }
                })
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show();
    }
Ranjithkumar
  • 697
  • 6
  • 16
-1

The solution is to replace by getActivity()

AlertDialog.Builder alert = new AlertDialog.Builder(getActivity(),R.style.MaDialog);
David Buck
  • 3,752
  • 35
  • 31
  • 35