android沉浸式状态栏的实现
16lz
2022-06-01
在style.xml中添加
[html] view plain copy
- <stylename="Theme.Timetodo"parent="@android:style/Theme.Holo.Light">
- <!--translucentsystembars-->
- <itemname="android:windowTranslucentStatus">true</item>
- <itemname="android:windowTranslucentNavigation">true</item>
- </style>
其中 android:windowTranslucentStatus表示是否要填充顶部的状态栏区域
android:windowTranslucentNavigation表示是否要填充底部的状态栏区域
这两种样式的目的就是默认让应用的内容放置到系统栏的下边,如果仅仅想扩展背景样式到系统栏下边,则需要设置android:fitsSystemWindows为true,
会增加试图的Pading值让你的布局恢复正常大小,并且可以将背景扩大。
在已经创建的Activity中添加
[java] view plain copy- packagecom.example.androidedemo;
- importjava.lang.reflect.Field;
- importandroid.annotation.SuppressLint;
- importandroid.app.ActionBar;
- importandroid.app.ActionBar.LayoutParams;
- importandroid.app.Activity;
- importandroid.content.res.Resources;
- importandroid.graphics.Color;
- importandroid.graphics.drawable.Drawable;
- importandroid.os.Bundle;
- importandroid.util.TypedValue;
- importandroid.view.Menu;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.view.Window;
- importandroid.view.WindowManager;
- importandroid.widget.LinearLayout;
- importandroid.widget.ListView;
- importandroid.widget.RelativeLayout;
- importandroid.widget.TextView;
- @SuppressLint("NewApi")
- publicclassMainActivityextendsActivity{
- privateRelativeLayoutrlLayout;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //设置ACtionBar
- ActionBaractionBar=getActionBar();
- Resourcesr=getResources();
- DrawablemyDrawable=r.getDrawable(R.drawable.ba);
- actionBar.setBackgroundDrawable(myDrawable);
- actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setHomeButtonEnabled(true);
- rlLayout=(RelativeLayout)findViewById(R.id.rlayout);
- ListViewlistView=(ListView)findViewById(R.id.listView);
- listView.setAdapter(newMyAdapter(getApplicationContext()));
- <spanstyle="white-space:pre"></span>//此处判断的目的是让Android系统大于等于4.4的系统才执行沉浸式的功能
- if(android.os.Build.VERSION.SDK_INT>18){
- Windowwindow=getWindow();
- window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
- window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
- }
- <spanstyle="white-space:pre"></span>//获取到系统通知栏的高度,然后给系统通知栏设置我们需要的颜色。并将其addView到ViewGroup中。
- //创建TextView
- TextViewtextView=newTextView(this);
- LinearLayout.LayoutParamslParams=newLinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,getStatusBarHeight());
- textView.setBackgroundColor(Color.parseColor("#3F9FE0"));
- textView.setLayoutParams(lParams);
- //获得根视图并把TextView加进去。
- ViewGroupview=(ViewGroup)getWindow().getDecorView();
- view.addView(textView);
- }
- //开启全屏模式
- @SuppressLint("NewApi")
- publicstaticvoidhideSystemUI(Viewview){
- view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
- |View.SYSTEM_UI_FLAG_FULLSCREEN
- |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
- }
- //取消全屏模式
- @SuppressLint("NewApi")
- publicstaticvoidshowSystemUI(Viewview){
- view.setSystemUiVisibility(
- View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
- }
- //获取手机状态栏高度
- publicintgetStatusBarHeight(){
- Class<?>c=null;
- Objectobj=null;
- Fieldfield=null;
- intx=0,statusBarHeight=0;
- try{
- c=Class.forName("com.android.internal.R$dimen");
- obj=c.newInstance();
- field=c.getField("status_bar_height");
- x=Integer.parseInt(field.get(obj).toString());
- statusBarHeight=getResources().getDimensionPixelSize(x);
- }catch(Exceptione1){
- e1.printStackTrace();
- }
- returnstatusBarHeight;
- }
- //获取ActionBar的高度
- publicintgetActionBarHeight(){
- TypedValuetv=newTypedValue();
- intactionBarHeight=0;
- if(getTheme().resolveAttribute(android.R.attr.actionBarSize,tv,true))//如果资源是存在的、有效的
- {
- actionBarHeight=TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
- }
- returnactionBarHeight;
- }
- }
在drawable文件夹中添加
[html] view plain copy- <?xmlversion="1.0"encoding="utf-8"?>
- <shapexmlns:android="http://schemas.android.com/apk/res/android">
- <gradient
- android:angle="270"
- android:endColor="#c8c8c8"
- android:startColor="#3F9FE0"
- android:type="linear"/>
- </shape>
此代码是给您的导航条设置一个渐变,目的是让导航条和系统通知栏的样式融合看起来更加紧密。
最后在AndroidManifest.xml文件中将Application中的theme更改为上边我们定义的样式
[html] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.androidedemo"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="8"/>
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/Theme.Timetodo">
- <activity
- android:name="com.example.androidedemo.MainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- </application>
- </manifest>
更多相关文章
- [Network]Android(安卓)N Ethernet新IP获取机制—IpManager
- Android(安卓)MotionEvent 坐标获取
- Android笔记【外观部分】
- Android(安卓)打开系统蓝牙设置
- Android获取版本号
- Android学习系列(40)--Android主题和样式之系统篇(下)
- 有关Android中EditText的一些属性
- Android(安卓)ApiDemos示例解析(15):App->Activity->SetWallpaper
- android中获得屏幕、视图、任务栏、状态栏的高宽以及屏幕的设置