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

时间:2014-09-17 00:52:02

标签: android android-preferences timepicker numberpicker android-timepicker

我制作了一个自定义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 个答案:

答案 0 :(得分:9)

我在这里找到了解决这个问题的方法:https://code.google.com/p/android/issues/detail?id=22754#c5,其中包含以下内容:

  

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

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

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

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

以下是我发布的最终工作自定义偏好设置的要点: