1. 程式人生 > >狀態列、標題欄、導航欄的瞭解

狀態列、標題欄、導航欄的瞭解

狀態列:是指手機左上最頂上,顯示中國移動、安全衛士、電量、網速等等,在手機的頂部。下拉就會出現通知欄。

標題欄:是指一個APP程式最上部的titleBar,從名字就知道它顯然就是一個應用程式一個頁面的標題了,例如開啟QQ訊息主頁,最上面顯示訊息那一欄就是標題欄。

導航欄:是手機最下面的返回,HOME,主頁三個鍵,有些是一個按鈕。

實現方式一:主題設定

隱藏標題欄:@android:style/Theme.Light.NoTitleBar  明亮的效果 或@android:style/Theme.NoTitleBar黑色的效果

隱藏狀態列和標題欄:@android:style/Theme.NoTitleBar.Fullscreen黑色效果或@android:style/Theme.Light.NoTitleBar.Fullscreen白色效果

實現方式二: 程式碼設定

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 隱藏標題欄
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // 隱藏狀態列 
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
            WindowManager.LayoutParams.FLAG_FULLSCREEN); 


        setContentView(R.layout.activity_main);
    }
}

實現方式三:通過設定主題中的屬性

<style name="AppTheme" parent="AppBaseTheme">

        <!-- 隱藏狀態列 -->
        <item name="android:windowFullscreen">true</item>
        <!-- 隱藏標題欄 -->
        <item name="android:windowNoTitle">true</item>


    </style>

附加知識:設定activity的透明效果,當A>B>C  再從C返回B返回A時,B會閃一下,這是介面重繪造成的,當將B設定成透明後,A的重繪就有時間,執行是會回到B但B是透明狀態,顯示的是C,給出A繪製時間,讓A平穩的展示,

這只是我自的一個理解,具體使用時再具體查。

<style name="activityTheme" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
    </style>

實現方式四 :通過視窗管理器設定狀態列的顯示隱藏

findViewById(R.id.btn_show).setOnClickListener(
                new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // 顯示狀態列
                        WindowManager.LayoutParams attr = getWindow()
                                .getAttributes();
                        attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
                        getWindow().setAttributes(attr);
                    }
                });
        findViewById(R.id.btn_hide).setOnClickListener(
                new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        //隱藏狀態列
                        WindowManager.LayoutParams lp = getWindow()
                                .getAttributes();
                        lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
                        getWindow().setAttributes(lp);
                    }
                });

附加知識:

Window 是一個抽象類,表示一個視窗,它的具體實現類是 PhoneWindow,實現位於 WindowManagerService 中。

WindowManagerService 就是位於 Framework 層的視窗管理服務,它的職責就是管理系統中的所有視窗。

Window 有三種類型,分別是應用 Window子 Window 和系統 Window,應用類 Window 對應一個 Acitivity,子 Window 不能單獨存在,需要依附在特定的父 Window 中,比如常見的一些 Dialog 就是一個子 Window。我們對 Window 的操作是通過 WindowManager 來完成的,WindowManager 是一個介面,它繼承自只有三個方法的 ViewManager 介面:

方式五:通過設定activity介面的view

 View類提供了setSystemUiVisibility和getSystemUiVisibility方法,這兩個方法實現對狀態列的動態顯示或隱藏的操作,以及獲取狀態列當前可見性。

setSystemUiVisibility方法傳入的實參分析:

   setSystemUiVisibility(int visibility)方法可傳入的實參為:

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

導航欄home鍵的禁用:

https://blog.csdn.net/jiuweitianhu_12345/article/details/53693489

總結自:

https://www.jb51.net/article/112718.htm

參考:

https://blog.csdn.net/yhaolpz/article/details/68936932