1. 程式人生 > >Android中windowTranslucentStatus與windowTranslucentNavigation的一些設定

Android中windowTranslucentStatus與windowTranslucentNavigation的一些設定

在iOS中,你可能發現頁面會整體拉昇到狀態列,整個頁面效果就會顯得更加的高階大氣上檔次,在Android4.4以後其實也有這種效果的實現,下面我就說一下在進行這種效果實現時碰到的一些坑,希望對大家有一些幫助吧。

首先來說一下關於這種效果的一些額外設定:

windowActionBar:這個應該大家都知道,在自定義的Theme中設定成false,就沒有系統預設的那個選單選項了。

windowNotTitle: 設定這個屬性為true則不顯示標題了

colorPrimary:這個屬性是你的actiinbar的屬性顏色
colorPrimaryDark:這個屬性則是你的標題欄的顏色,你可以設定和你自定義的標題欄一個顏色,就可以達到以下這種效果
接下來我們看看windowTranslucentStatus屬性與windowTranslucentNavigation屬性的設定,首先,我們要知道,Android版本到4.4才會有個屬性,所以說不管你是在程式碼中進行實現或者是在資原始檔style中進行實現,你都需要進行版本的控制。首先在資原始檔中進行實現,你要建立一個新的資料夾,value-v19,在這個資料夾中建立
style檔案進行編輯,在其中設定主題,定義屬性
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
然後給你的activity設定這個style,第一個屬性很明顯就是可以拉昇到頂部狀態列,並且定義頂部狀態列透明,這樣你的頁面就是一整張了,沒有上面電池背景條之類的了,整個頁面看上去會好很多,第二個屬性,是設定你的虛擬鍵透明,這個虛擬鍵就是返回和選單鍵等,現在有的手機會放到螢幕上,而有的是沒有的。到這個時候,如果你的手機有虛擬鍵的話,你會發現問題來了,你會發現你的頁面拉伸到了虛擬鍵的下面,也就是頁面填充了整個螢幕,不留一點空間了,如果你是列表的話,那麼無所謂,並不影響操作和頁面效果,如果你的是最下面有按鈕的頁面的話,你會發現這玩意就是一個坑啊,因為你的按鈕填充到了下面,你根本按不到,而且如果你設定了透明屬性的話,你會發現虛擬鍵和你最下面的按鈕都重合在一起,具體效果
圖如下圖所示:
然後你開始在style裡改變兩個屬性的所有制測試,發現都沒有什麼卵用,我不知道還有沒有其他的解決辦法,反正當我做到這裡的時候,認定了它就是一個巨坑。
在你的佈局檔案中設定fitsSystemWindows這個屬性其實也不會拉昇到最下面,但是這樣的話。。。。連上面都不拉伸了,有什麼意義,而且好像設定了以後,你設定的
colorPrimaryDark也會無效,也可能是我的水平不行,反正被這個地方坑了好久。
但是不要急,辦法總是人想出來,在xml檔案中進行設定既然不方便,不靈活,那麼我們就試試去Java程式碼中設定這個屬性。
根絕前面說的那個坑,我們先判斷一下你的手機是否含有NavigationBar這個東西,就是虛擬鍵,判斷程式碼如下
public static boolean isHaveNavigationBar(Context context) {

    boolean isHave = false;
    Resources rs = context.getResources();
    int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
    if (id > 0) {
        hasNavigationBar = rs.getBoolean(id);
    }
    try {
        Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
        Method m = systemPropertiesClass.getMethod("get", String.class);
        String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
        if ("1".equals(navBarOverride)) {
            isHave = false;
        } else if ("0".equals(navBarOverride)) {
            isHave = true;
        }
    } catch (Exception e) {
        Log.w("TAG", e);
    }


    return isHave;
}
返回為true的話就不給他設定,反之設定,具體程式碼如下:
public static void transportStatus(Activity context){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        if (!isHaveNavigationBar(context))
            context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
}
這樣就可以達到想要的效果了.