Android更改主题样式后TimePicker导致crash问题记录

最近碰到一个很奇怪的问题,接手的一个Android项目由于存在屏幕偶现黑条的bug,猜测可能是当前主题和程序存在内存问题导致,于是决定先修改一下主题再做进一步测试。
当前主题:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

修改后的主题:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
	<!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoTitle_FullScreen"> <!--自定义主题名称-->
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
</style>

修改主题后,点击某tab,显示某页面,切换tab再次回到该页面时崩溃,必现。
崩溃信息如下:

java stacktrace:
java.lang.IndexOutOfBoundsException: setSpan (2 ... 2) 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:5017)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:515)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
	at dalvik.system.NativeStart.main(Native Method)

经过对该页面的代码进行详细分析,未发现导致该崩溃的地方。于是考虑layout文件,对组件进行逐一注释,发现将TimerPicker组件注释后不会崩溃。
于是进一步搜索,得到如下解决方案:

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

参考链接:

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×