使用 SlidingMenu (jfeinstein10/SlidingMenu) 庫實現側滑選單,主 Activity 設定透明狀態欄 (FLAG_TRANSLUCENT_STATUS) 失效,其他 Activity 正常。經排查,**SlidingMenu 內部佈局機制強制佔用狀態欄區域**,導致沉浸式失效。
SlidingMenu 透過 attachToActivity(this, SLIDING_WINDOW) 將選單視圖添加到 `Window` 的 `DecorView` 中,其內部 `CustomViewAbove` / `CustomViewBehind` 佈局過程中**強制設定 `fitsSystemWindows=true` 或調整 `WindowInsets`**,覆蓋了 Activity 設定的沉浸式旗標。
<androidx.drawerlayout.widget.DrawerLayout ...>
<!-- 主內容 -->
<FrameLayout android:id="@+id/content_container" ... />
<!-- 側滑選單 -->
<com.google.android.material.navigation.NavigationView ... />
</androidx.drawerlayout.widget.DrawerLayout>
在 `Activity.onCreate` 中:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
// DrawerLayout 會正確處理 fitsSystemWindows
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= 19) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 強制重新佈局
getWindow().getDecorView().requestLayout();
}
}
「SlidingMenu 這樣的自定義控件,是不能設置沉浸式狀態欄的」—— 提問者最終自行總結。官方
DrawerLayout經過大量機型測試,完美支援沉浸式、刘海屏、水劃手勢,新專案**零理由**使用已停更 8 年的 SlidingMenu。
遷移至官方組件,徹底解決沉浸式衝突,並獲得長期維護保障。