Android 如何消除DatePickerDialog方向更改时的onDismiss错误?
我有一个DatePickerDialog,它在片段中成功启动。当方向发生变化时,应用程序崩溃。logcat输出表示NPE在DatePickerFragment中与onDismiss一起发生。onDismiss代码用于切换软键盘以再次显示(在启动DatePickerDialog后将其关闭)。当我删除onDismiss代码时,应用程序不再崩溃。我错过了什么 下面是部分DatePickerFragment文件:Android 如何消除DatePickerDialog方向更改时的onDismiss错误?,android,android-fragments,android-datepicker,Android,Android Fragments,Android Datepicker,我有一个DatePickerDialog,它在片段中成功启动。当方向发生变化时,应用程序崩溃。logcat输出表示NPE在DatePickerFragment中与onDismiss一起发生。onDismiss代码用于切换软键盘以再次显示(在启动DatePickerDialog后将其关闭)。当我删除onDismiss代码时,应用程序不再崩溃。我错过了什么 下面是部分DatePickerFragment文件: public class DatePickerFragment extends Dialo
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
public DatePickerFragment() {
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
...
DatePickerDialog picker = new DatePickerDialog(getActivity(),
this, year, month, day);
return picker;
}
public void onDismiss(final DialogInterface dialog) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(CardViewActivity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
super.onDismiss(dialog);
}
}
这是我拥有的另一个片段,它可以处理方向变化,而不会发生崩溃,键盘切换也不会正确打开:
public class CreateSkycardFragment extends DialogFragment {
public CreateSkycardFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.skyfrag_layout, container, false);
getDialog().setTitle("Delete card");
Button btnCancel = (Button) rootView.findViewById(R.id.btnCancel);
btnCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(CardViewActivity.INPUT_METHOD_SERVICE);
// The soft keyboard always closes when the DialogFragment is displayed. So the
// line below toggles the soft keyboard to show again.
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
// The line below cancels the dialog box.
getDialog().cancel();
}
});
// When the user clicks "OK" to delete for the "Delete skycard" dialog.
Button btnOK = (Button) rootView.findViewById(R.id.btnOK);
btnOK.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Next line dismisses the DialogFragment
dismiss();
// Next line returns to the previous activity (MainActivity) by closing
// the current activity (CardViewActivity).
getActivity().finish();
}
});
getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(android.content.DialogInterface dialog, int keyCode, KeyEvent event) {
if ((keyCode == android.view.KeyEvent.KEYCODE_BACK)) {
if (event.getAction()!= KeyEvent.ACTION_DOWN)
// Next line dismisses the dialogfragment
dismiss();
// Next line returns to the previous activity (MainActivity) by closing the fragment and
// the current activity (CardViewActivity).
getActivity().finish();
return true;
}
return false;
}
});
return rootView;
}
}问题是您启动了一项活动,并且有一些变量。 当你旋转屏幕时,你用变量破坏了这个活动。 现在,当您到达
onDismiss
时,您正试图消除一个已经在旋转更改中被破坏的值
您可以尝试将变量设置为静态。
因此它变成了“staticvariable”。dismissDialog()。问题是您启动了一个活动,并且您有一些变量。 当你旋转屏幕时,你用变量破坏了这个活动。 现在,当您到达
onDismiss
时,您正试图消除一个已经在旋转更改中被破坏的值
您可以尝试将变量设置为静态。
因此它变成了“staticvariable”。dismissDialog()。好的,关于如何修复它有什么想法吗?您正在将活动作为参数传递给输入法管理器,这意味着它正在使用它。当您的活动被销毁时,使用imm会使应用程序崩溃,因为它本来是要被其他活动使用的。将变量设置为静态会带来自身的问题。我建议不要这样做。我认为你需要重新考虑你的策略。在这种情况下,没有太多的其他选择。我从另一个片段中得到了类似的代码,可以很好地处理方向改变。我将编辑上面的问题以显示代码。这是否有助于解释为什么onDismiss在DatePicker片段中不起作用,而在另一个片段中起作用?好的,关于如何修复,有什么想法吗?您正在将活动作为参数传递给输入法管理器,这意味着它正在使用它。当您的活动被销毁时,使用imm会使应用程序崩溃,因为它本来是要被其他活动使用的。将变量设置为静态会带来自身的问题。我建议不要这样做。我认为你需要重新考虑你的策略。在这种情况下,没有太多的其他选择。我从另一个片段中得到了类似的代码,可以很好地处理方向改变。我将编辑上面的问题以显示代码。这是否有助于解释为什么onDismiss在DatePicker片段中不起作用,而在另一个片段中起作用?