android沉浸式状态栏的实现

简介: 在style.xml中添加 [html] view plaincopy <style name="Theme.Timetodo" parent="@android:style/Theme.Holo.Light">           <!-- translucent system bars --&g

在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>  
目录
相关文章
|
21天前
|
编解码 Shell Android开发
Android屏幕自适应1
Android屏幕自适应
33 0
|
21天前
|
编解码 Java Android开发
Android屏幕自适应2
Android屏幕自适应
18 0
|
8月前
|
Java API Android开发
Android 最新实现沉浸式状态栏的效果
Android 最新实现沉浸式状态栏的效果
125 0
|
9月前
|
XML Java API
Android 沉浸式状态栏必知必会
Android 沉浸式状态栏追根究底
448 0
|
XML 编解码 API
浅谈 Android 屏幕适配
几组概念 分辨率 屏幕上物理像素的总数。添加对多种屏幕的支持时, 应用不会直接使用分辨率;而只应关注通用尺寸和密度组指定的屏幕尺寸及密度。
283 0
浅谈 Android 屏幕适配
|
Android开发
Android侧滑菜单
Android侧滑菜单
97 0
|
Android开发
Android侧滑原来可以这么优雅
一个框架解决所有侧滑需求,所有功能都可一行代码完成调用
13229 0
|
编解码 Android开发 iOS开发
|
Android开发 数据格式 XML

热门文章

最新文章