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

Android Activity全屏实现疑难:隐藏栏时的卡顿与视图异常

解决Activity全屏模式的卡顿与后台恢复异常问题

嘿,我来帮你搞定这两个头疼的问题!咱们一个一个来:

问题1:启动Activity时隐藏操作卡顿

你遇到的先显示ActionBar再隐藏的过渡延迟,核心原因是运行时动态修改UI状态,这些操作其实完全可以提前通过主题配置完成,避免启动时的UI重绘开销。

解决方案:

  1. 你已经在Manifest里给ListItemActivity设置了@android:style/Theme.AppCompat.Light.NoActionBar,这已经帮你去掉了ActionBar,所以代码里的getSupportActionBar().hide()完全是多余的,反而会增加额外的UI操作,加重卡顿。
  2. 直接使用全屏主题替代代码里的动态全屏设置,这样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>
      
  3. 删掉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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:00:37