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

onResume调用getVisibility时FloatingActionButton异常显示可见求助

问题原因及解决方案

核心问题点

  1. Intent Extras 不会自动清除:你在onStop中将状态存入当前Activity的Intent Extras,但这个数据会一直保留在Intent中,除非显式移除。只要曾经设置过StopButtonIsVisible为true,后续每次进入onResume都会读取到这个值,强制将按钮设为可见,忽略按钮实际的当前状态。
  2. 硬编码判断可见性:用isVisible==0来判断按钮可见性不够规范,应该使用Android提供的常量View.VISIBLE,代码可读性更高且避免潜在错误。
  3. 状态保存方式错误:Intent Extras的设计目的是传递启动Activity的参数,而非保存Activity的临时状态。正确的临时状态保存应该使用onSaveInstanceState方法。

修正后的代码

1. 重写onSaveInstanceState保存状态

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // 保存按钮的当前可见状态
    outState.putBoolean("StopButtonIsVisible", fabStopRecording.getVisibility() == View.VISIBLE);
}

2. 在onResume中恢复状态

@Override
protected void onResume() {
    super.onResume();
    loadSharedPreferences();
    
    // 从savedInstanceState恢复状态,而非Intent Extras
    if (savedInstanceState != null) {
        boolean isStopButtonVisible = savedInstanceState.getBoolean("StopButtonIsVisible");
        fabStopRecording.setVisibility(isStopButtonVisible ? View.VISIBLE : View.INVISIBLE);
    } else {
        // 首次启动或无保存状态时,恢复布局文件中的初始设置
        fabStopRecording.setVisibility(View.INVISIBLE);
    }
    
    // 地图初始化逻辑保留
    mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

额外说明

  • onSaveInstanceState会在Activity即将被销毁(如退后台、屏幕旋转)时自动调用,用于保存临时状态;对应的onRestoreInstanceState方法也可以用来恢复状态,和在onResume中恢复效果一致。
  • 移除原onStop中向Intent存数据的逻辑,避免无效数据干扰。

内容的提问来源于stack exchange,提问作者Bernd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:48:14