1. 程式人生 > >Android實現activity內嵌fragment時狀態列浸入式

Android實現activity內嵌fragment時狀態列浸入式

1.概述

開發遇到浸入式  有時候也挺頭疼的  新公司開發又遇到浸入式的問題了  於是研究了一下  完成了需求  記錄一下

浸入式其實就是狀態列半透明的效果 能夠在頁面滑動的時候狀態列背景和頁面的背景一致

2.效果圖

這裡就是浸入式的效果了  值得一提的是  浸入式的透明效果在 華為等部分手機上不是全透明的  

就像下面 有個明顯的半透明色值

3.實現浸入式

首先先看我給的樣式

<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> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item>
<item name="android:listDivider">@drawable/recycler_head_grad_item</item> </style>

樣式的作用是讓我們的activity充滿整個螢幕 包括狀態列 

佈局檔案如下  id為header的linearLayout即我們activity的title

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android
:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:id="@+id/header" android:layout_width="match_parent" android:layout_height="50dp" android:background="@color/bluecolor" android:gravity="center" android:orientation="horizontal"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="訊息" android:textColor="@color/white" android:textSize="18sp" /> </LinearLayout>

 此時的效果是這個樣子的


可以發現 此時狀態列並沒有自己的高度  我們的title頂到最上面去了  這樣的話我們的標題會被狀態列覆蓋達不到我們想要的效果   

我的想法是給title一個更高的高度  然後讓我們的title  padding頂部一個狀態列的高度   然後內容居中這樣就達到我們想要的效果了 程式碼如下

private void initView(View view) {
    View view1 = view.findViewById(R.id.header);
initAfterSetContentView(getActivity(), view1);
@TargetApi(Build.VERSION_CODES.KITKAT)
public static void initAfterSetContentView(Activity activity, View titleViewGroup) {
    if (activity == null)
        return;
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
        Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        if (titleViewGroup == null)
            return;
// 設定頭部控制元件ViewGroupPaddingTop,防止介面與狀態列重疊
int statusBarHeight = getStatusBarHeight(activity);
titleViewGroup.setPadding(0, statusBarHeight, 0, 0);
}
}
/**
 * 獲取狀態列高度
* @param context
* @return
*/
private static int getStatusBarHeight(Context context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier(
            "status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
}
    return result;
}

這樣做的目的就是讓我們的title距離頂部一個狀態列的高度 這樣效果就達到了我們效果圖的樣子  

這樣可以解決一個activity內嵌多個fragment時的浸入式

因為之前我的想法是在每一個fragment中設定狀態列   前三個狀態列設定狀態列顏色  第四個設定浸入式 

但我發現 這樣是有bug的 因為我在前三個fragment中給狀態列設定顏色  在第四個fragment是讓狀態列浸入式  

當我點到第四個fragment時  整個activity都變成浸入式了  

我意識到我犯了一個錯誤fragment中改變的也是activity的狀態列 於是我改成上面程式碼的模式了 

當然不要忘記在你的mainActivity中新增上狀態列半透明的程式碼

// 狀態列透明
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

如有錯誤敬請指正 不勝感激

後來發現一個bug及時更正  在安卓版本5.0一下的手機是沒有浸入式的  我這樣做就會導致狀態列高度特別高  我手動修改了一下高度  程式碼如下

@TargetApi(Build.VERSION_CODES.KITKAT)
public static void initAfterSetContentView(Activity activity,
View titleViewGroup) {
    if (activity == null){
        return;
}

    if (titleViewGroup == null){
        return;
}

    if (Build.VERSION.SDK_INT >Build.VERSION_CODES.KITKAT) {
        Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 設定頭部控制元件ViewGroupPaddingTop,防止介面與狀態列重疊
int statusBarHeight = getStatusBarHeight(activity);
titleViewGroup.setPadding(0, statusBarHeight, 0, 0);
}else {
        LinearLayout.LayoutParams params= (LinearLayout.LayoutParams) titleViewGroup.getLayoutParams();
params.height = 70;
titleViewGroup.setLayoutParams(params);
}
}