You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在onSaveInstanceState中保存并恢复FloatingActionButton的当前颜色?

保存并恢复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:07:39