1. 程式人生 > >Android 狀態列、標題欄、螢幕高度、全屏

Android 狀態列、標題欄、螢幕高度、全屏

你也可以檢視我的其他同類文章,也會讓你有一定的收貨!

1.獲取狀態列高度:

decorView是window中的最頂層view,可以從window中獲取到decorView,然後decorView有個getWindowVisibleDisplayFrame()方法可以獲取到程式顯示的區域,包括標題欄,但不包括狀態列。
於是,我們就可以算出狀態列的高度了。

Rect frame = new Rect();  
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
int statusBarHeight = frame.top
;

2.獲取標題欄高度:

  • getWindow().findViewById(Window.ID_ANDROID_CONTENT)這個方法獲取到的view就是程式不包括標題欄的部分,然後就可以知道標題欄的高度了。

  • getTop() 獲得頂部距離父容器的距離

int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();  
//statusBarHeight是上面所求的狀態列的高度  
int titleBarHeight = contentTop - statusBarHeight  

3.獲取螢幕寬度和高度

方法 1.

WindowManager windowManager = getWindowManager();  

Display display = windowManager.getDefaultDisplay();  

screenWidth = display.getWidth();  

screenHeight = display.getHeight(); 

方法 2.

DisplayMetrics dm = new DisplayMetrics();  

this.getWindowManager().getDefaultDisplay().getMetrics
(dm);//this指當前activity screenWidth =dm.widthPixels; screenHeight =dm.heightPixels;

以上兩種方法在螢幕未顯示的時候,還是處於0的狀態,即要在setContentView呼叫之後才有效。

設定為無標題

requestWindowFeature(Window.FEATURE_NO_TITLE);    

設定為全屏模式getWindow().setFlags

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

全屏

Android全屏,隱藏狀態列和標題欄,這個功能很簡單,但是在繼承activity和AppCompatActivity區別還是有點區別的,經常用到,所以這裡稍微總結一下。

下面兩種情況的第一種方法,都會看到短暫的狀態列,然後才全屏,而第二種方法是不會有這種情況的

繼承activity時

下面介紹兩種方法:

1、使用程式碼進行隱藏,程式碼如下:

第一種

 @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(getLayout());
        mUnBinder = ButterKnife.bind(this);
        mContext = this;
        initInject();
        if (mPresenter != null)
            mPresenter.attachView(this);
        App.getInstance().addActivity(this);
        initEventAndData();
    }

在這裡要強調一點,設定全屏的倆段程式碼必須在setContentView(R.layout.main) 之前,不然會報錯。

或者自定義標題欄

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1);

R.layout.custom_title_1 這個就是你的標題檔案佈局

第二種

使用style進行隱藏

關鍵程式碼如下:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

如果想只是去除標題欄就後面不用加Fullscreen了,另外,如果想要整個應用都去除標題欄和狀態列,就把這句程式碼加到 < application />標籤裡面,如果只是想某個activity起作用,這句程式碼就加到相應的activity.也可用它自定義樣式。

用前者在我們應用執行後,會看到短暫的狀態列,然後才全屏,而第二種方法是不會有這種情況的,所以我建議大家使用第二種

如果繼承的是AppCompatActivity,但是使用了Activity的樣式,就會報下面這個錯誤:

Java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

繼承AppCompatActivity時

下面介紹兩種方法:

第一種

在java中隱藏,程式碼如下:

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().hide();//隱藏標題欄
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN); // 隱藏狀態列
        setContentView(getLayout());
        mUnBinder = ButterKnife.bind(this);
        mContext = this;
        initInject();
        if (mPresenter != null)
            mPresenter.attachView(this);
        App.getInstance().addActivity(this);
        initEventAndData();
    }

第二種

2、使用style進行隱藏

<resources>  

    <!-- Base application theme. -->  
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">  
        <!-- Customize your theme here. -->  
        <item name="colorPrimary">@color/colorPrimary</item>  
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>  
        <item name="colorAccent">@color/colorAccent</item>  
    </style>  

   <!-- 這個樣式,就是隱藏標題欄和狀態列-->  
    <style name="AppTheme.NoBar">  
        <item name="windowNoTitle">true</item>  
        <item name="android:windowFullscreen">true</item>  
    </style>  

</resources> 

在manifest.xml中使用該樣式

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    package="com.jianchi.fsp.myapplication">  

    <application  
        android:allowBackup="true"  
        android:icon="@mipmap/ic_launcher"  
        android:label="@string/app_name"  
        android:supportsRtl="true"  
        android:theme="@style/AppTheme">  
        <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoBar">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
    </application>  

</manifest>  

主題Theme

android:theme="@android:style/Theme.Dialog"   將一個Activity顯示為能話框模式  
android:theme="@android:style/Theme.NoTitleBar"  不顯示應用程式標題欄  
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不顯示應用程式標題欄,並全屏  
android:theme="Theme.Light"  背景為白色  
android:theme="Theme.Light.NoTitleBar"  白色背景並無標題欄   
android:theme="Theme.Light.NoTitleBar.Fullscreen"  白色背景,無標題欄,全屏  
android:theme="Theme.Black"  背景黑色  
android:theme="Theme.Black.NoTitleBar"  黑色背景並無標題欄  
android:theme="Theme.Black.NoTitleBar.Fullscreen"    黑色背景,無標題欄,全屏  
android:theme="Theme.Wallpaper"  用系統桌面為應用程式背景  
android:theme="Theme.Wallpaper.NoTitleBar"  用系統桌面為應用程式背景,且無標題欄  
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"  用系統桌面為應用程式背景,無標題欄,全屏  
android:theme="Translucent"  半透明  
android:theme="Theme.Translucent.NoTitleBar" 半透明、無標題欄  
android:theme="Theme.Translucent.NoTitleBar.Fullscreen" 半透明、無標題欄、全屏  
android:theme="Theme.Panel"  
android:theme="Theme.Light.Panel"  

關注我的公眾號,輕鬆瞭解和學習更多技術
這裡寫圖片描述