Android 中沉浸式状态栏实现方式如下
计算状态栏高度及调用沉浸式状态栏的相关API方法
1 package com.example.status; 2 import android.annotation.TargetApi; 3 import android.app.Activity; 4 import android.content.Context; 5 import android.os.Build; 6 import android.view.View; 7 import android.view.Window; 8 import android.view.WindowManager; 9 public class ImmersedStatusbarUtils { 10 11 /** 12 * 在{@link Activity#setContentView}之后调用 13 * 14 * @param activity 15 * 要实现的沉浸式状态栏的Activity 16 * @param titleViewGroup 17 * 头部控件的ViewGroup,若为null,整个界面将和状态栏重叠 18 */ 19 @TargetApi(Build.VERSION_CODES.KITKAT) 20 public static void initAfterSetContentView(Activity activity, 21 View titleViewGroup) { 22 if (activity == null) 23 return; 24 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 25 Window window = activity.getWindow(); 26 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 27 } 28 if (titleViewGroup == null) 29 return; 30 // 设置头部控件ViewGroup的PaddingTop,防止界面与状态栏重叠 31 int statusBarHeight = getStatusBarHeight(activity); 32 titleViewGroup.setPadding(0, statusBarHeight, 0, 0); 33 34 } 35 36 /** 37 * 获取状态栏高度 38 * 39 * @param context 40 * @return 41 */ 42 private static int getStatusBarHeight(Context context) { 43 int result = 0; 44 int resourceId = context.getResources().getIdentifier( 45 "status_bar_height", "dimen", "android"); 46 if (resourceId > 0) { 47 result = context.getResources().getDimensionPixelSize(resourceId); 48 } 49 return result; 50 } 51 }
调用实例,使用步骤一编写的相关方法。
1 package com.example.status; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.Menu; 6 import android.view.View; 7 import android.view.Window; 8 9 public class MainActivity extends Activity { 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 requestWindowFeature(Window.FEATURE_NO_TITLE); 15 setContentView(R.layout.activity_main); 16 View topView = findViewById(R.id.lin); 17 ImmersedStatusbarUtils.initAfterSetContentView(this, topView); 18 } 19 20 @Override 21 public boolean onCreateOptionsMenu(Menu menu) { 22 // Inflate the menu; this adds items to the action bar if it is present. 23 getMenuInflater().inflate(R.menu.main, menu); 24 return true; 25 } 26 27 }
对应的布局文件
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <LinearLayout 8 android:id="@+id/lin" 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content" 11 android:background="#ff123654" > 12 13 <TextView 14 android:id="@+id/title" 15 android:layout_width="match_parent" 16 android:layout_height="45.0dp" 17 android:background="#ff123654" 18 android:gravity="center" 19 android:text="我是头部控件" 20 android:textColor="#ffffffff" /> 21 </LinearLayout> 22 23 </LinearLayout>