1. 程式人生 > >Android中windowTranslucentStatus與windowTranslucentNavigation的一些設置(轉)

Android中windowTranslucentStatus與windowTranslucentNavigation的一些設置(轉)

windows 屏幕 contex 拉伸 新的 system 整體 navbar 額外

在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);
        }
}

這樣就可以達到想要的效果了.

https://blog.csdn.net/zjt593688/article/details/52606980

Android中windowTranslucentStatus與windowTranslucentNavigation的一些設置(轉)