android狀態欄和NavigationBar的動態控制顯示


項目在開發閱讀器,閱讀器對閱讀界面的要求就是在工具欄不顯示的狀態下,ActionBar和NavigationBar都是不顯示的,當工具欄顯示時它們都出來,這就需要動態控制它們的顯示與隱藏。

第一階段:沒有考慮NavigationBar的情況,單純控制ActionBar的顯示與隱藏

private void full(boolean enable) {
        if (enable) {
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
            getWindow().setAttributes(lp);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        } else {
            WindowManager.LayoutParams attr = getWindow().getAttributes();
            attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
            getWindow().setAttributes(attr);
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        }
    }

第二階段:測試發現華為手機NavigationBar會影響使用,開始動態設置ActionBar和NavigationBar的隱藏與顯示

private void full(boolean enable) {
        if (enable) {
            if (Build.VERSION.SDK_INT >= 19) {
                getWindow().getDecorView().setSystemUiVisibility(
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            }
        } else {
            if (Build.VERSION.SDK_INT >= 19) {
                getWindow().getDecorView().setSystemUiVisibility(
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            }
        }

上面講實現,再來看看用法:

android想要應用運行時全屏有一種方法是在activity的onCreat方法中加入如下代碼:getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);並且需要在setContentView()之前,否則無效過。從這么多的苛刻條件可以看出這種方法無法滿足動態控制。

下面的方法可以滿足這個需要。調用View的 setSystemUiVisibility()

方法,其參數如下:

 1     View.SYSTEM_UI_FLAG_VISIBLE, //顯示狀態欄,Activity不全屏顯示(恢復到有狀態的正常情況)。
 2 
 3     View.INVISIBLE, //隱藏狀態欄,同時Activity會伸展全屏顯示。
 4 
 5     View.SYSTEM_UI_FLAG_FULLSCREEN ,  //Activity全屏顯示,且狀態欄被隱藏覆蓋掉。
 6 
 7     View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN, //Activity全屏顯示,但狀態欄不會被隱藏覆蓋,狀態欄依然可見,Activity頂端布局部分會被狀態遮住。
 8 
 9     View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION, //效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
10 
11     View.SYSTEM_UI_LAYOUT_FLAGS, //效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
12 
13     View.SYSTEM_UI_FLAG_HIDE_NAVIGATION, //隱藏虛擬按鍵(導航欄)。有些手機會用虛擬按鍵來代替物理按鍵。
14 
15     View.SYSTEM_UI_FLAG_LOW_PROFILE,  //狀態欄顯示處於低能顯示狀態(low profile模式),狀態欄上一些圖標顯示會被隱藏。

Color:

Android design theme color

<style name="AppTheme.NoActionBar">
    <!--狀態欄顏色-->
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <!--控制各個控件被選中時的顏色-->
    <item name="colorAccent">@color/colorAccent</item>
    <!--頁面背景色-->
    <item name="android:windowBackground">@color/windowBackg</item>
    <!--底部導航欄顏色-->
    <item name="android:navigationBarColor">@color/navigationColor</item>
    <!--Appbar背景色-->
    <item name="android:colorPrimary">@color/colorPrimary</item>
    <!--ToolBar上的Title顏色-->
    <item name="android:textColorPrimary">@color/textColorPrimary</item>
    <!--各個控制控件的默認顏色-->
    <item name="android:colorControlNormal">@color/colorControlNormal</item>
</style>

 網文參考:

Android狀態欄微技巧,動態控制狀態欄顯示和隱藏


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM