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; // 設定頭部控制元件ViewGroup的PaddingTop,防止介面與狀態列重疊 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); // 設定頭部控制元件ViewGroup的PaddingTop,防止介面與狀態列重疊 int statusBarHeight = getStatusBarHeight(activity); titleViewGroup.setPadding(0, statusBarHeight, 0, 0); }else { LinearLayout.LayoutParams params= (LinearLayout.LayoutParams) titleViewGroup.getLayoutParams(); params.height = 70; titleViewGroup.setLayoutParams(params); } }