Android屏幕旋转时onSaveInstanceState与onRestoreInstanceState无法保存颜色问题
旋转后颜色不保存问题修复说明
你的代码存在3处核心问题,按如下方案修改即可生效:
问题1:onCreate无条件生成新随机颜色
Activity旋转重建时,onCreate会优先执行,当前代码没有判断是否为重建状态,每次都会调用generateRandomColors()生成新的随机颜色,直接覆盖后续恢复逻辑的结果。
修复方案:
修改onCreate中生成颜色的逻辑,仅首次创建时生成随机颜色:
// 原代码:generateRandomColors(); // 替换为如下逻辑 if (savedInstanceState == null) { generateRandomColors(); }
问题2:onRestoreInstanceState的switch判断逻辑错误
你在switch中传入的是带引号的"nameOfColor",这是固定字符串常量,永远无法匹配下方的颜色case,恢复逻辑完全不执行。
问题3:恢复时未给全局colorName变量赋值
现有恢复逻辑仅修改了TextView背景色,没有给全局的colorName变量赋值,后续用户提交答案时会出现校验错误。
问题2+3的修复方案:
修改onRestoreInstanceState的逻辑如下:
@Override public void onRestoreInstanceState(@Nullable Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if(savedInstanceState != null){ String nameOfColor = savedInstanceState.getString("Question_TextViewColor"); // 去掉引号,传入变量本身做判断 switch(nameOfColor){ case "BLUE": question_TextView.setBackgroundColor(Color.BLUE); colorName = "BLUE"; break; case "RED": question_TextView.setBackgroundColor(Color.RED); colorName = "RED"; break; case "GREEN": question_TextView.setBackgroundColor(Color.GREEN); colorName = "GREEN"; break; case "CYAN": question_TextView.setBackgroundColor(Color.CYAN); colorName = "CYAN"; break; case "BLACK": question_TextView.setBackgroundColor(Color.BLACK); colorName = "BLACK"; break; case "YELLOW": question_TextView.setBackgroundColor(Color.YELLOW); colorName = "YELLOW"; break; case "ORANGE": question_TextView.setBackgroundColor(Color.rgb(235, 122, 52)); colorName = "ORANGE"; break; case "GRAY": question_TextView.setBackgroundColor(Color.GRAY); colorName = "GRAY"; break; case "PINK": question_TextView.setBackgroundColor(Color.rgb(235, 52, 180)); colorName = "PINK"; break; case "PURPLE": question_TextView.setBackgroundColor(Color.rgb(131, 52, 235)); colorName = "PURPLE"; break; } } }
内容的提问来源于stack exchange,提问作者Imtiaz
相关产品推荐
相关产品推荐

