繁体   English   中英

NullPointerException on dialog.cancel()

[英]NullPointerException on dialog.cancel()

我有一个带有2个按钮(确定和取消)的对话框视图。 当用户单击“取消”按钮时,我使用dialog.cancel()关闭了该对话框。 在模拟器和我的手机上都可以正常工作。 但是我得到一些用户崩溃的报告,在dialog.cancel()行上显示NullPointerException。 有人看到我关闭对话框的方式有问题吗?

码:

@Override
public Dialog onCreateDialog(int id) {
    switch (id) {
        case (SHOW_DIALOG): {
            LayoutInflater li1 = LayoutInflater.from(this);
            View wView = li1.inflate(R.layout.dialog_w, null);
            AlertDialog.Builder wDialog = new AlertDialog.Builder(this);
            wDialog.setTitle("Dialog");
            wDialog.setIcon(android.R.drawable.ic_menu_add);
            wDialog.setView(wView);

            final DatePicker wDatePicker = (DatePicker) wView
                                    .findViewById(R.id.dialog_w_Date);
            final TextView DateTitleText = (TextView) wView
                                    .findViewById(R.id.dialog_w_Date_Title);
            final EditText wEditText = (EditText) wView
                                    .findViewById(R.id.dialog_w_w_EditText);
            final EditText bEditText = (EditText) wView
                                    .findViewById(R.id.dialog_w_b_EditText);

            wDialog.setPositiveButton("Ok",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        String wDateStr = "";
                        String wStr = "";
                        String bStr = "";
                        Calendar wDate = Calendar.getInstance();
                        wDate.set(wDatePicker.getYear(),
                        wDatePicker.getMonth(),
                        wDatePicker.getDayOfMonth());
                        wDateStr = DateUtil.CalendarToString(wDate);
                        wStr = wEditText.getText().toString();
                        bStr = bEditText.getText().toString();
                        if(wStr.length()<1)
                            wStr = Double.toString(userObj.getW());
                        if(bStr.length()<1)
                            bStr = Double.toString(userObj.getB());

                        mDbHelper.insertW(wDateStr,wStr,bStr);

                        updateFromSettings();
                        updateFromDB();
                        updateUI();
                        dialog.cancel();
                        }
                    });

            //NullPointerException Happening here
            wDialog.setNeutralButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                        }
                    });
                    return wDialog.create();
            }
        }
        return null;
    }

@Override
public void onPrepareDialog(int id, Dialog dialog) {
    switch (id) {
        case (SHOW_DIALOG): {
            AlertDialog wDialog = (AlertDialog) dialog;
            DatePicker dp = (DatePicker) wDialog
                                    .findViewById(R.id.dialog_w_Date);
            EditText w = (EditText) wDialog
                                    .findViewById(R.id.dialog_w_w_EditText);
            EditText b = (EditText) wDialog
                                    .findViewById(R.id.dialog_w_b_EditText);

            Calendar c = Calendar.getInstance();
            int cYear = c.get(Calendar.YEAR);
            int cMonth = c.get(Calendar.MONTH);
            int cDay = c.get(Calendar.DAY_OF_MONTH);
            dp.init(cYear, cMonth, cDay, null);
            w.setText("");
            b.setText("");

            w.setHint(Double.toString(userObj.getW()));
            b.setHint(Double.toString(userObj.getB()));

            break;
            }
        }
    }

这是StackTrace:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.woodsy.appname/com.woodsy.appname.UserActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1872)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4385)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.woodsy.appname.UserActivity.onCreateDialog(UserActivity.java:269)
at android.app.Activity.onCreateDialog(Activity.java:2643)
at android.app.Activity.createDialog(Activity.java:924)
at android.app.Activity.restoreManagedDialogs(Activity.java:913)
at android.app.Activity.performRestoreInstanceState(Activity.java:859)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1138)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1850)
... 11 more

您不需要在对话框上显式调用cancel。 对话框中没有侦听器的按钮将导致对话框消失(关闭)。 因此,您甚至可以通过以下方式进行操作:

wDialog.setNeutralButton("Cancel", null)

如果仅将null设置为onClickListener,则对话框将关闭,最好使用imo。

 wDialog.setNeutralButton("Cancel", null)

与Waqas和Rasive相比,我将在这里走不同的方向,因为他们的答案与您的堆栈跟踪不符。 您在onCreateDialog()中得到了一个空指针异常。 您当时没有执行任何onClickListener()方法,而是仍在尝试创建对话框。 因此,此时您是否要调用cancel()或这些方法中的任何内容都没有关系。 这不会在代码中造成NPE。

我以某种方式怀疑您没有告诉我们正确的信息。 不是故意的,而是偶然的。 我的想法不是问题出在onCreateDialog() ,而是这个问题的另一个版本或另一个版本 (您确实说过这是一个市场应用程序……在您的应用程序的最新版本中发生了吗?)您的Activity成员变量之一。 我之所以这样说是因为我在此方法中看不到任何非局部变量,也没有任何可以想象为null的东西,然后随后将其取消引用。

您能否再次检查是否包含正确的代码?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM