最近碰到一个很奇怪的问题,接手的一个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);