android沉浸式状态栏的实现

简介: <p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> 在style.xml中添加</p> <p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> <br><

在style.xml中添加


[html]  view plain copy
  1. <style name="Theme.Timetodo" parent="@android:style/Theme.Holo.Light">  
  2.   
  3.      <!-- translucent system bars -->  
  4.      <item name="android:windowTranslucentStatus">true</item>  
  5.      <item name="android:windowTranslucentNavigation">true</item>  
  6.  </style>  


其中 android:windowTranslucentStatus表示是否要填充顶部的状态栏区域
android:windowTranslucentNavigation表示是否要填充底部的状态栏区域
这两种样式的目的就是默认让应用的内容放置到系统栏的下边,如果仅仅想扩展背景样式到系统栏下边,则需要设置android:fitsSystemWindows为true,
会增加试图的Pading值让你的布局恢复正常大小,并且可以将背景扩大。


在已经创建的Activity中添加

[java]  view plain copy
  1. package com.example.androidedemo;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. import android.annotation.SuppressLint;  
  6. import android.app.ActionBar;  
  7. import android.app.ActionBar.LayoutParams;  
  8. import android.app.Activity;  
  9. import android.content.res.Resources;  
  10. import android.graphics.Color;  
  11. import android.graphics.drawable.Drawable;  
  12. import android.os.Bundle;  
  13. import android.util.TypedValue;  
  14. import android.view.Menu;  
  15. import android.view.View;  
  16. import android.view.ViewGroup;  
  17. import android.view.Window;  
  18. import android.view.WindowManager;  
  19. import android.widget.LinearLayout;  
  20. import android.widget.ListView;  
  21. import android.widget.RelativeLayout;  
  22. import android.widget.TextView;  
  23.   
  24. @SuppressLint("NewApi")  
  25. public class MainActivity extends Activity {  
  26.     private RelativeLayout rlLayout;  
  27.   
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_main);  
  32.         //设置ACtionBar  
  33.         ActionBar actionBar = getActionBar();  
  34.         Resources r = getResources();  
  35.         Drawable myDrawable = r.getDrawable(R.drawable.ba);  
  36.         actionBar.setBackgroundDrawable(myDrawable);  
  37.           
  38.         actionBar.setDisplayHomeAsUpEnabled(true);  
  39.         actionBar.setHomeButtonEnabled(true);  
  40.           
  41.         rlLayout = (RelativeLayout) findViewById(R.id.rlayout);  
  42.         ListView listView = (ListView) findViewById(R.id.listView);  
  43.         listView.setAdapter(new MyAdapter(getApplicationContext()));  
  44.           
[java]  view plain copy
  1. <span style="white-space:pre">    </span>//此处判断的目的是让Android系统大于等于4.4的系统才执行沉浸式的功能  
  2.         if (android.os.Build.VERSION.SDK_INT > 18) {  
  3.             Window window = getWindow();  
  4.             window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);  
  5.             window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
  6.         }  
[java]  view plain copy
  1. <span style="white-space:pre">    </span>//获取到系统通知栏的高度,然后给系统通知栏设置我们需要的颜色。并将其addView到ViewGroup中。  
  2.         // 创建TextView  
  3.          TextView textView = new TextView(this);  
  4.          LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, getStatusBarHeight());  
  5.          textView.setBackgroundColor(Color.parseColor("#3F9FE0"));  
  6.          textView.setLayoutParams(lParams);  
  7.          // 获得根视图并把TextView加进去。  
  8.          ViewGroup view = (ViewGroup) getWindow().getDecorView();  
  9.          view.addView(textView);  
  10.      }  
  11.   
  12.   
  13.     //开启全屏模式  
  14.     @SuppressLint("NewApi")  
  15.     public static void hideSystemUI(View view) {  
  16.         view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE  
  17.                 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  
  18.                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  
  19.                 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION  
  20.                 | View.SYSTEM_UI_FLAG_FULLSCREEN  
  21.                 | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);  
  22.     }  
  23.   
  24.     //取消全屏模式  
  25.     @SuppressLint("NewApi")  
  26.     public static void showSystemUI(View view) {  
  27.         view.setSystemUiVisibility(  
  28.                 View.SYSTEM_UI_FLAG_LAYOUT_STABLE  
  29.                 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  
  30.                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);  
  31.     }  
  32.       
  33.  // 获取手机状态栏高度  
  34.     public int getStatusBarHeight() {  
  35.         Class<?> c = null;  
  36.         Object obj = null;  
  37.         Field field = null;  
  38.         int x = 0, statusBarHeight = 0;  
  39.         try {  
  40.             c = Class.forName("com.android.internal.R$dimen");  
  41.             obj = c.newInstance();  
  42.             field = c.getField("status_bar_height");  
  43.             x = Integer.parseInt(field.get(obj).toString());  
  44.             statusBarHeight = getResources().getDimensionPixelSize(x);  
  45.         } catch (Exception e1) {  
  46.             e1.printStackTrace();  
  47.         }  
  48.         return statusBarHeight;  
  49.     }  
  50.   
  51.     // 获取ActionBar的高度  
  52.     public int getActionBarHeight() {  
  53.         TypedValue tv = new TypedValue();  
  54.         int actionBarHeight = 0;  
  55.         if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))// 如果资源是存在的、有效的  
  56.         {  
  57.             actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());  
  58.         }  
  59.         return actionBarHeight;  
  60.     }  
  61. }  



在drawable文件夹中添加

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.   
  4.     <gradient  
  5.         android:angle="270"  
  6.         android:endColor="#c8c8c8"  
  7.         android:startColor="#3F9FE0"  
  8.         android:type="linear" />  
  9.   
  10. </shape>    

此代码是给您的导航条设置一个渐变,目的是让导航条和系统通知栏的样式融合看起来更加紧密。


最后在AndroidManifest.xml文件中将Application中的theme更改为上边我们定义的样式

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.androidedemo"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="8" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/Theme.Timetodo" >  
  16.         <activity  
  17.             android:name="com.example.androidedemo.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.   
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.         </activity>  
  25.     </application>  
  26.   
  27. </manifest>  
目录
相关文章
|
Java API Android开发
Android 最新实现沉浸式状态栏的效果
Android 最新实现沉浸式状态栏的效果
246 0
|
Android开发
flutter中实现仿Android端的onResume和onPause方法
flutter中实现仿Android端的onResume和onPause方法
|
8月前
|
Android开发
Android 状态栏WiFi图标的显示逻辑
Android 状态栏WiFi图标的显示逻辑
199 0
|
5月前
|
API Android开发 开发者
Android经典实战之用WindowInsetsControllerCompat方便的显示和隐藏状态栏和导航栏
本文介绍 `WindowInsetsControllerCompat` 类,它是 Android 提供的一种现代化工具,用于处理窗口插入如状态栏和导航栏的显示与隐藏。此类位于 `androidx.core.view` 包中,增强了跨不同 Android 版本的兼容性。主要功能包括控制状态栏与导航栏的显示、设置系统窗口行为及调整样式。通过 Kotlin 代码示例展示了如何初始化并使用此类,以及如何设置系统栏的颜色样式。
255 2
|
5月前
|
API Android开发 Kotlin
Android实战经验分享之如何获取状态栏和导航栏的高度
在Android开发中,掌握状态栏和导航栏的高度对于优化UI布局至关重要。本文介绍两种主要方法:一是通过资源名称获取,简单且兼容性好;二是利用WindowInsets,适用于新版Android,准确性高。文中提供了Kotlin代码示例,并对比了两者的优缺点及适用场景。
412 1
|
7月前
|
API Android开发
31. 【Android教程】状态栏通知:Notification
31. 【Android教程】状态栏通知:Notification
603 1
|
8月前
|
XML 存储 测试技术
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
Android系统 添加动态控制SystemUI状态栏、导航栏和下拉菜单
1390 1
|
XML Java API
Android 沉浸式状态栏必知必会
Android 沉浸式状态栏追根究底
836 0
|
Java 测试技术 API
Android透明状态栏和导航栏方案最终版
Android透明状态栏和导航栏方案最终版
915 0
|
Android开发
Android 11 SystemUI(状态/导航栏)-状态栏下拉时图标的隐藏与通知面板的半透黑色背景
Android 11 SystemUI(状态/导航栏)-状态栏下拉时图标的隐藏与通知面板的半透黑色背景
900 0
Android 11 SystemUI(状态/导航栏)-状态栏下拉时图标的隐藏与通知面板的半透黑色背景