Android Activity全屏实现疑难:隐藏栏时的卡顿与视图异常
解决Activity全屏模式的卡顿与后台恢复异常问题
嘿,我来帮你搞定这两个头疼的问题!咱们一个一个来:
问题1:启动Activity时隐藏操作卡顿
你遇到的先显示ActionBar再隐藏的过渡延迟,核心原因是运行时动态修改UI状态,这些操作其实完全可以提前通过主题配置完成,避免启动时的UI重绘开销。
解决方案:
- 你已经在Manifest里给
ListItemActivity设置了@android:style/Theme.AppCompat.Light.NoActionBar,这已经帮你去掉了ActionBar,所以代码里的getSupportActionBar().hide()完全是多余的,反而会增加额外的UI操作,加重卡顿。 - 直接使用全屏主题替代代码里的动态全屏设置,这样Activity启动时就直接进入全屏状态,不会有任何过渡延迟:
- 可以直接用系统自带的全屏主题:
@style/Theme.AppCompat.Light.NoActionBar.Fullscreen - 或者自定义更贴合需求的主题(推荐),在
styles.xml里添加:<style name="FullScreenLyricsTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> </style> - 然后修改Manifest里
ListItemActivity的主题:<activity android:name="com.example.android.bilyrics.ListItemActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@style/FullScreenLyricsTheme" > </activity>
- 可以直接用系统自带的全屏主题:
- 删掉
onCreate里所有手动隐藏ActionBar和设置全屏的代码,这些工作现在都由主题完成了,修改后的onCreate更简洁:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_item); /* Set click listener for close image */ findViewById(R.id.iv_close).setOnClickListener(this); /* Init fields and needed params */ mSvLyrics = findViewById(R.id.sv_lyrics); mTvLyrics = findViewById(R.id.tv_lyrics); mErrorMessageDisplay = findViewById(R.id.tv_item_error_message_display); mLoadingIndicator = findViewById(R.id.pb_item_loading_indicator); final Intent intent = getIntent(); /* Set Track properties in the views */ ((TextView)findViewById(R.id.tv_item_artist)).setText(intent.getStringExtra(LyricsAPI.KEY_ARTIST_NAME)); ((TextView)findViewById(R.id.tv_item_title)).setText(intent.getStringExtra(LyricsAPI.KEY_TRACK_NAME)); /* Fetch Lyrics for the track */ URL lyricsUrl = AidUtils.buildUrl(intent.getStringExtra(LyricsAPI.KEY_TRACK_ID), LyricsAPI.RequestType.TRACK_LYRICS_GET); new AsyncFetchLyrics().execute(lyricsUrl); }
问题2:后台恢复后视图异常(TextView不显示、ImageView无法点击)
这个问题的根源是你在onResume()里调用了setContentView(R.layout.activity_list_item)!每次执行onResume都会重新加载整个布局,这意味着:
- 你在
onCreate里初始化的mSvLyrics、mTvLyrics等变量指向的是旧的视图实例,新加载的布局里的控件根本没有绑定监听器,也没设置过数据 - 所以才会出现TextView不显示、ImageView无法响应点击的情况
解决方案:
彻底修改onResume(),只保留恢复全屏状态的逻辑,删掉重新加载布局的代码:
@Override protected void onResume() { super.onResume(); // 仅恢复全屏状态,应对从后台返回时状态栏可能被恢复的情况 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); }
如果你用了前面推荐的全屏主题,其实连这行代码都可以省掉,但保留它能兼容一些特殊场景(比如用户手动拉出状态栏后返回)。
总结
- 启动卡顿:用主题配置替代运行时动态修改UI状态,彻底消除过渡延迟
- 后台恢复异常:绝对不要在
onResume()里重新加载布局,只需要恢复必要的全屏状态即可
内容的提问来源于stack exchange,提问作者Adiel
相关产品推荐
相关产品推荐

