在使用 TimePicker 或 NumberPicker 查看对话框首选项时旋转 Android 设备会导致应用程序崩溃

Posted

技术标签:

【中文标题】在使用 TimePicker 或 NumberPicker 查看对话框首选项时旋转 Android 设备会导致应用程序崩溃【英文标题】:Rotating Android device while viewing dialog preference with TimePicker or NumberPicker causes app crash 【发布时间】:2014-11-10 21:41:02 【问题描述】:

我制作了一个自定义DialogPreference,它使用两个NumberPicker 小部件来允许用户选择一天中的一个小时以及另一个自定义DialogPreference,它允许用户选择一天中的某个时间使用TimePicker 小部件。

只要对话框没有打开并且我旋转屏幕,一切都会按预期进行。但是,如果对话框打开并且屏幕旋转,那么整个应用程序就会崩溃。我已经在onSaveInstanceStateonRestoreInstanceState 方法中放置了断点,并验证了恢复DialogPreference 所需的一切都是有序的,onDialogClosed 方法甚至每次都与所有其他自定义代码一起被命中我有我的自定义DialogPreference

我正在构建以下内容:

最小 SDK:16 目标 SDK:20 编译 SDK:20 构建工具:20.0.0

发生这种情况时,我正在 Verizon Galaxy Nexus 上运行 android 4.4.3 (KitKat)。

这是给出的堆栈跟踪:

java.lang.IndexOutOfBoundsException: setSpan (4 ... 4) ends beyond length 0
  at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1016)
  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:592)
  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
  at android.text.Selection.setSelection(Selection.java:76)
  at android.widget.EditText.setSelection(EditText.java:87)
  at android.widget.NumberPicker$SetSelectionCommand.run(NumberPicker.java:2123)
  at android.os.Handler.handleCallback(Handler.java:733)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5001)
  at java.lang.reflect.Method.invokeNative(Method.java)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
  at dalvik.system.NativeStart.main(NativeStart.java)

【问题讨论】:

【参考方案1】:

我在这里找到了解决这个问题的方法:https://code.google.com/p/android/issues/detail?id=22754#c5,上面写着:

在 onCreate 方法中,在 findviewbyId 之后为时间选择器添加以下内容:

tp.setSaveFromParentEnabled(false);
tp.setSaveEnabled(true);

这消除了错误。但是,对话框不会保持打开状态。但这似乎是所有非自定义首选项的默认功能,所以我很满意。

以下是上述两种方法的文档:

setSaveFromParentEnabled setSaveEnabled

以下是我发布的关于我的最终工作自定义首选项的要点:

HourOfDayPreference TimePreference

【讨论】:

以上是关于在使用 TimePicker 或 NumberPicker 查看对话框首选项时旋转 Android 设备会导致应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

我可以自定义 Android 默认提供的 TimePicker 或 DatePicker 吗?

WPF (.NET 4) 中是不是有 TimePicker 控件?

Vue.js 和 jQuery datepicker/timepicker 双向绑定

在编辑表单上隐藏 Rails 4 上 jquery.timepicker 的空日期值

DialogFragment timepicker onCancel 和 onDismiss 问题

android timepicker 可以显示秒数吗