onResume调用getVisibility时FloatingActionButton异常显示可见求助
问题原因及解决方案
核心问题点
- Intent Extras 不会自动清除:你在
onStop中将状态存入当前Activity的Intent Extras,但这个数据会一直保留在Intent中,除非显式移除。只要曾经设置过StopButtonIsVisible为true,后续每次进入onResume都会读取到这个值,强制将按钮设为可见,忽略按钮实际的当前状态。 - 硬编码判断可见性:用
isVisible==0来判断按钮可见性不够规范,应该使用Android提供的常量View.VISIBLE,代码可读性更高且避免潜在错误。 - 状态保存方式错误: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
相关产品推荐
相关产品推荐

