android手機導航欄

/**
 * 設置透明狀態欄與導航欄
 * @param navi true不設置導航欄|false設置導航欄
 */
public void setStatusBar(boolean navi) {
    //api>21,全透明狀態欄和導航欄;api>19,半透明狀態欄和導航欄
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.TRANSPARENT);
        if (navi) {
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN//狀態欄不會被隱藏但activity佈局會擴展到狀態欄所在位置
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION//導航欄不會被隱藏但activity佈局會擴展到導航欄所在位置
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.setNavigationBarColor(Color.TRANSPARENT);
        } else {
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        }
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        if (navi) {
            //半透明導航欄
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
        //半透明狀態欄
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
}
/**
 * 進入沉浸模式
 * @param view view
 */
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static void hideSystemUI(View view) {
    view.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//會自動隱藏
    );
}

/**
 * 退出沉浸模式
 * @param view view
 */
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static void showSystemUI(View view) {
    view.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
注意:狀態欄或導航欄進行透明處理以後,我們的佈局內容是會擴展到原來狀態欄與導航欄的位置,可是這樣就會形成狀態欄顯示的內容與咱們的佈局內容重疊,因此接下來
還須要進行一步處理,本人偷懶因此只是在代碼中獲取頁面最上面的控件進行paddingTop出狀態欄的高度(國內大多數品牌的手機都是沒有底部導航欄的,因此不作處理)
獲取狀態欄高度的代碼:
/**
 * 獲取狀態欄高度
 *
 * @param context 上下文
 * @return 狀態欄高度
 */
public int getStatusBarHeight(Context context) {
    int statusBarHeight = 0;
    try {
        Class<?> clazz = Class.forName("com.android.internal.R$dimen");
        Object obj = clazz.newInstance();
        Field field = clazz.getField("status_bar_height");
        int temp = Integer.parseInt(field.get(obj).toString());
        statusBarHeight = context.getResources().getDimensionPixelSize(temp);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return statusBarHeight;
}主要的幾個flag:public static final int SYSTEM_UI_FLAG_HIDE_NAVIGATION = 0x00000002;  隱藏導航欄public static final int SYSTEM_UI_FLAG_FULLSCREEN = 0x00000004;  字面意思是全屏顯示,實際是狀態欄會被隱藏而導航欄未做處理public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 0x00000200;  導航欄不會被隱藏但佈局會擴展到導航欄所在位置public static final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 0x00000400;  狀態欄不會被隱藏但佈局會擴展到狀態欄所在位置public static final int SYSTEM_UI_FLAG_IMMERSIVE = 0x00000800;  配合SYSTEM_UI_FLAG_HIDE_NAVIGATION使用,若是隻有SYSTEM_UI_FLAG_HIDE_NAVIGATION而不設置SYSTEM_UI_FLAG_IMMERSIVE,那麼用戶交互後會自動清除SYSTEM_UI_FLAG_HIDE_NAVIGATION這個flag;public static final int SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 0x00001000;  配合SYSTEM_UI_FLAG_HIDE_NAVIGATION和(或)SYSTEM_UI_FLAG_FULLSCREEN使用,設置這個flag以後,用戶在屏幕頂部下滑或者在底部上滑調出狀態欄、導航欄以後它們仍會自動隱藏;
相關文章
相關標籤/搜索