NullPointerException when creating a new Dialog

时光怂恿深爱的人放手 提交于 2019-12-22 04:11:59

问题


I have a DialogFragment that creates a listview dialog and on a list item click I want to display an alert dialog but when I create the dialog it gives me a NullPointerException with an error that I have never seen before

08-05 11:40:42.315: E/AndroidRuntime(4693): java.lang.NullPointerException
08-05 11:40:42.315: E/AndroidRuntime(4693):     at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:142)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at android.app.AlertDialog$Builder.<init>(AlertDialog.java:359)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at com.tyczj.bowling.dialogs.SeasonType$1$1.onClick(SeasonType.java:60)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at android.os.Looper.loop(Looper.java:137)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at android.app.ActivityThread.main(ActivityThread.java:4745)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at java.lang.reflect.Method.invokeNative(Native Method)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at java.lang.reflect.Method.invoke(Method.java:511)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-05 11:40:42.315: E/AndroidRuntime(4693):     at dalvik.system.NativeStart.main(Native Method)

Here is my Dialog's onCreate

@Override
public Dialog onCreateDialog(Bundle state){
    final Dialog d = new Dialog(getActivity());
    d.setContentView(R.layout.dialog_layout);
    d.setTitle("Select a season");
    ListView lv = (ListView)d.findViewById(R.id.dialog_list);
    String[] list = getResources().getStringArray(R.array.season_dialog_type);
    lv.setAdapter(new ArrayAdapter<String>(getActivity(),R.layout.stats_list_layout,list));
    lv.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
            d.dismiss();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            if(arg2 == 0){
                DialogFragment df = new SeasonsDialog(true);
                df.show(ft,null);
            }else if(arg2 == 1){
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                final View v = getActivity().getLayoutInflater().inflate(R.layout.add_season_layout, null, false);
                builder.setTitle("Add a season").setView(v).setPositiveButton("Add", new OnClickListener(){

                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        arg0.dismiss();
                        AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity()); //Error here
                        builder2.setTitle("Warning!").setMessage("Adding a new season will cause all new games to be under this season.\n\n Do you wish to continue?")
                        .setPositiveButton("Yes", new OnClickListener(){

                            @Override
                            public void onClick(DialogInterface dialog,int which) {
                                dialog.dismiss();
                                EditText et = (EditText)v.findViewById(R.id.editText1);
                                ContentValues values = new ContentValues();
                                values.put(Games.SEASON, et.getText().toString());
                                Uri uri = getActivity().getContentResolver().insert(Games.SEASONS_URI, values);
                                et.setText("");
                                SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
                                SharedPreferences.Editor edit = pref.edit();
                                edit.putLong(Preferences.SELECTED_SEASON, ContentUris.parseId(uri)).commit();
                            }

                        }).setNegativeButton("No", new OnClickListener(){

                            @Override
                            public void onClick(DialogInterface dialog,int which) {
                                dialog.dismiss();
                            }

                        }).create().show();
                    }

                }).setNegativeButton("Cancel", new OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }

                }).create().show();
            }

        }

    });

    return d;
}

it error's out at this line in my onClick

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

what does that error mean?


回答1:


It could be because you are trying to call getActivity() from within an onClick Listener. Typically Anonymous inner classes like to only access things that are final. Trying right before creating your listener to do something like

final Context context = getActivity();

and then use context instead of getActivity() on the line that crashes.

And as a note. I would use DialogFragment here. It manages the lifecycle of your Dialog much better. Your going to run into issues when you try rotating the screen when the Dialog is open. However with the DialogFragment it will take care of this for you.




回答2:


Try this

AlertDialog alrt = (AlertDialog )arg0;
AlertDialog.Builder builder = new AlertDialog.Builder(alrt.getContext());

Also dismiss the old dialog after showing new dialog.



来源:https://stackoverflow.com/questions/11817840/nullpointerexception-when-creating-a-new-dialog

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!