[英]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.