<resources> <!--应用的基本主题 --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 自定义应用主题 --> <!--标题颜色--> <item name="colorPrimary">@color/colorPrimary</item> <!--状态栏颜色--> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <!--text /checkBox颜色--> <item name="colorAccent">@color/colorAccent</item> </style> </resources> |
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-这里是activity -> </application> |
Activity activity = this; int color=Color.parseColor("#008000"); //针对版本5.x以上的即LOLLIPOP以上的 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //非全屏幕修改状态栏颜色 Window window = activity.getWindow(); //FLAG_TRANSLUCENT_STATUS为状态栏类型:半透明效果 //取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色 //FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS为状态栏类型:支持着色 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); //设置状态栏颜色 setStatusBarColor要求21以上 window.setStatusBarColor(color); ViewGroup contentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT); View childView = contentView.getChildAt(0);//对应activity布局文件根标签 if (childView != null) { //注意不是设置 ContentView 的 FitsSystemWindows, 而是设置 ContentView 的第一个子 View . 预留出系统 View 的空间. ViewCompat.setFitsSystemWindows(childView, true); } } |
//去掉titlebar-全屏模式 supportRequestWindowFeature(Window.FEATURE_NO_TITLE); //细节supportRequestWindowFeature一定要在setContentView之前设置 setContentView(R.layout.activity_code_full); Activity activity = this; int statusColor = Color.parseColor("#008000"); //针对版本5.x以上的即LOLLIPOP以上的 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); //设置透明状态栏,这样才能让 ContentView 向上 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); //设置状态栏颜色 window.setStatusBarColor(statusColor); ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT); View mChildView = mContentView.getChildAt(0); if (mChildView != null) { //注意不是设置 ContentView 的 FitsSystemWindows, 而是设置 ContentView 的第一个子 View . // 使其不为系统 View 预留空间.不预留空间的话 状态栏就会覆盖布局顶部 ViewCompat.setFitsSystemWindows(mChildView, false); } } |
private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height"; public static int getStatusBarHeight(Context context) { int result = 0; //访问android.jar内的dimen中包含的status_bar_height属性值 int resourceId = context.getResources().getIdentifier(STATUS_BAR_HEIGHT_RES_NAME, "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } return result; } |
//去掉titlebar-全屏模式 supportRequestWindowFeature(Window.FEATURE_NO_TITLE); //细节supportRequestWindowFeature一定要在setContentView之前设置 setContentView(R.layout.activity_code_full); |
//KITKAT为4.4sdk的名称 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); ViewGroup contentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT); //首先使 ChildView 不预留空间 View childView = contentView.getChildAt(0);//layout file对应的根标签 if (childView != null) { //此时status会遮盖contnetview ViewCompat.setFitsSystemWindows(childView, false); } int statusBarHeight = getStatusBarHeight(activity); //需要设置这个 flag 才能设置状态栏 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //避免多次调用该方法时,多次移除了 View if (childView != null && childView.getLayoutParams() != null && childView.getLayoutParams().height == statusBarHeight) { //移除假的 View. contentView.removeView(childView); childView = contentView.getChildAt(0); } if (childView != null) { FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) childView.getLayoutParams(); //清除 ChildView 的 marginTop 属性 if (lp != null && lp.topMargin >= statusBarHeight) { //减少layout的topmargin 使用layout布局的整体延伸到statusBar下方 lp.topMargin -= statusBarHeight; childView.setLayoutParams(lp); } } } |
//判断当前sdk是4.4 KITKAT为4.4sdk的名称 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); ViewGroup contentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT); //设置状态栏透明 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //获取状态栏高度 int statusBarHeight = getStatusBarHeight(activity); //在全屏模式下 使用contentView内容下移状态栏高度 View childView = contentView.getChildAt(0); if (childView != null) { FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) childView.getLayoutParams(); //如果已经为 ChildView 设置过了 marginTop, 再次调用时直接跳过 if (lp != null && lp.topMargin < statusBarHeight && lp.height != statusBarHeight) { //不预留系统空间 ViewCompat.setFitsSystemWindows(childView, false); lp.topMargin += statusBarHeight;//在状态栏透明的情况下 contentView marginTop改为状态栏高度 childView.setLayoutParams(lp); } } //下移的状态栏高度 已经存在着色View直接设置color View statusBarView = contentView.getChildAt(0); if (statusBarView != null && statusBarView.getLayoutParams() != null && statusBarView.getLayoutParams().height == statusBarHeight) { //避免重复调用时多次添加已经着色的View statusBarView.setBackgroundColor(statusColor); }else { //如果未存在刚添加着色View下次通过contentView.getChildAt(0);即为该着色View statusBarView = new View(activity); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight); statusBarView.setBackgroundColor(statusColor); //向 ContentView 中添加已经着色的View contentView.addView(statusBarView, 0, lp); } } } |
2016-05-03_233550.png (53.29 KB, 下载次数: 280)
2016-05-04_000017.png (69.68 KB, 下载次数: 266)
Studio 发表于 2016-5-6 11:29
老师什么时候带我们一大帮子去大保健啊
zjf1992 发表于 2016-5-10 00:23
看起来真的很高深.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |