如何在onSaveInstanceState中保存并恢复FloatingActionButton的当前颜色?
嘿,这个需求其实很好实现,而且有两种比较靠谱的方式,我给你详细拆解下:
方法一:利用已有的SAVE状态变量(推荐)
从你的代码里能看到,你已经用SAVE这个布尔变量来标记按钮的切换状态了——点击后SAVE=true对应一组颜色,默认状态SAVE=false对应另一组。这种情况下直接保存这个状态变量是最简洁清晰的,不用额外处理颜色值:
保存状态
@Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); // 保存当前的SAVE状态 outState.putBoolean("IS_SAVE_MODE", SAVE); }
恢复状态
@Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if(savedInstanceState!=null) { // 获取保存的状态,默认值设为false(对应初始状态) boolean isSaveMode = savedInstanceState.getBoolean("IS_SAVE_MODE", false); // 根据状态恢复对应颜色 if (isSaveMode) { fabDOWN.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.FLOAT_dark_GREEN))); fabUP.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.FLOAT_bright_RED))); SAVE = true; } else { // 这里替换成你的按钮初始颜色,比如默认状态下fabUP是绿色、fabDOWN是红色 fabUP.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.FLOAT_dark_GREEN))); fabDOWN.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.FLOAT_bright_RED))); SAVE = false; } } }
注意:我把
getResources().getColor()换成了ContextCompat.getColor(),这样能兼容API 23以下的版本,避免出现兼容性问题。
方法二:直接保存按钮的颜色值
如果你不想依赖SAVE变量,也可以直接获取当前按钮的颜色值并保存,恢复时直接设置:
保存状态
@Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); // 获取两个按钮当前的颜色值 int fabUpCurrentColor = fabUP.getBackgroundTintList().getDefaultColor(); int fabDownCurrentColor = fabDOWN.getBackgroundTintList().getDefaultColor(); // 保存到Bundle中 outState.putInt("FAB_UP_COLOR", fabUpCurrentColor); outState.putInt("FAB_DOWN_COLOR", fabDownCurrentColor); // 同步保存SAVE变量,避免状态不一致 outState.putBoolean("IS_SAVE_MODE", SAVE); }
恢复状态
@Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if(savedInstanceState!=null) { // 取出保存的颜色值并设置 int savedFabUpColor = savedInstanceState.getInt("FAB_UP_COLOR"); int savedFabDownColor = savedInstanceState.getInt("FAB_DOWN_COLOR"); fabUP.setBackgroundTintList(ColorStateList.valueOf(savedFabUpColor)); fabDOWN.setBackgroundTintList(ColorStateList.valueOf(savedFabDownColor)); // 同步恢复SAVE变量的状态 SAVE = savedInstanceState.getBoolean("IS_SAVE_MODE", false); } }
两种方法里更推荐第一种,因为状态变量的逻辑更直观,也能避免颜色值判断可能带来的误差~
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

