Android 如何消除DatePickerDialog方向更改时的onDismiss错误?

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

我有一个DatePickerDialog,它在片段中成功启动。当方向发生变化时,应用程序崩溃。logcat输出表示NPE在DatePickerFragment中与onDismiss一起发生。onDismiss代码用于切换软键盘以再次显示(在启动DatePickerDialog后将其关闭)。当我删除onDismiss代码时,应用程序不再崩溃。我错过了什么

下面是部分DatePickerFragment文件:

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片段中不起作用,而在另一个片段中起作用?