對於 android5.0 以上的狀態欄沉浸方法,我看到的大部分說法是下面的style
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:windowTranslucentStatus">false</item> <item name="android:windowTranslucentNavigation">true</item> <item name="android:statusBarColor">@android:color/transparent</item> </style>
剛開始我也是這么用的,似乎沒有什么問題,但是后來發現在有底部虛擬按鍵的設備上,我的應用布局會和三個虛擬按鍵重疊,但是我想要的效果是我的布局在虛擬鍵之上
於是我去掉了這句話
<item name="android:windowTranslucentNavigation">true</item>
然后我的狀態欄卻不再沉浸了,不太清除這句話為什么會影響狀態欄,看起來好像只會影響底部虛擬鍵的樣子
於是另找解決辦法,實現了沉浸狀態欄的同時布局位於虛擬鍵之上
核心代碼如下,java代碼和item需要同時使用
代碼中加上這段代碼
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) try { Class decorViewClazz = Class.forName("com.android.internal.policy.DecorView"); Field field = decorViewClazz.getDeclaredField("mSemiTransparentStatusBarColor"); field.setAccessible(true); field.setInt(getWindow().getDecorView(), Color.TRANSPARENT); //改為透明 } catch (Exception e) { }
style中加上下面的item
<item name="android:windowTranslucentStatus">true</item>
原理參考下文,好像是用反射解決的,鏈接如下