最近对“爸比讲故事”Android版本进行代码重构的时候,对之前版本的大部分界面的头部侵入式效果,作了一个总结和梳理,在期间查阅了thinkcool的博客和结合亲身实践,总结了2种侵入式实现的不同思路:

两种方式都会使用到Android的一个属性:fitsSystemWindows

第一种:不添加view覆盖status bar的方式,在Toolbar控件上添加fitSystemWindows属性为true

首先来看看这种方式在不同版本手机的表现方式

1、Android SDK 4.3(level 18)以下的表现效果为:APP 的内容不被上拉到状态,不占据status bar,不透明效果

74647b24f40e

不占据status bar

2、Android SDK 5.1 (level 22)华为畅享5s的表现效果为:占据status bar,全透明效果

74647b24f40e

占据status bar

3、Android SDK 5.1 (level 22)vivio手机的表现效果为:status bar半透明效果

74647b24f40e

占据status bar

fitSystemWindows属性:

官方描述:

Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.

简单描述:

这个一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为true,就会调整view的paingding属性来给system windows留出空间....

实际效果:

当status bar为透明或半透明时(4.4以上),系统会设置view的paddingTop值为一个适合的值(status bar的高度)让view的内容不被上拉到状态栏,当在不占据status bar的情况下(4.4以下)会设置paddingTop值为0(因为没有占据status bar所以不用留出空间)。

主题:

使用Theme.AppCompat.Light.NoActionBar(toolbar的兼容主题):既可以适配使用toolbar(由于google已经不再建议使用action bar了,而是推荐使用toolbar,且toolbar的使用更加的灵活,所以toolbar和actionbar的选择也没什么好纠结的)和不使用toolbar的情况(即自定义topBar布局)。

// Toobar的style

match_parent

wrap_content

?attr/actionBarSize

?attr/colorPrimary

true

@style/ThemeOverlay.AppCompat.Dark.ActionBar

@style/ThemeOverlay.AppCompat.Light

1)AndroidManifest.xml中:使用Theme.AppCompat.Light.NoActionBar主题

android:name=".app.BBApp"

android:allowBackup="true"

android:icon="@mipmap/icon_72_2x"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme" // 引入了@style/AppTheme

tools:replace="android:allowBackup">

android:name=".activity.ActivityWelcome"

android:screenOrientation="portrait"

android:theme="@style/AppTheme.Transparent.Splash.Fullscreen"

android:windowSoftInputMode="stateAlwaysHidden">

android:name=".activity.ActivityHome"

android:label="@string/app_name"

android:theme="@style/AppTheme" // 引入了@style/AppTheme

android:screenOrientation="portrait">

// @style/AppTheme对应的样式为:

@color/colorPrimaryDark

@color/colorPrimary

@color/navigationBarColor

@color/windowBackground

@color/colorAccent

2)activity的layout.xml为:

// layout/activity_home.xml

// 文件中:

// 1、引入了inc_toolbar.xml布局

// 2、不需要在外部容器id为ll_home的LinearLayout中添加fitsSystemWindows属性

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/ll_home"

style="@style/MatchMatch.Vertical"

android:background="@android:color/white"

android:orientation="vertical">

style="@style/DemoBtn"

android:onClick="testSwipeBack"

android:text="测试滑动返回"/>

style="@style/DemoBtn"

android:onClick="testSwipeDelete"

android:text="测试滑动删除"/>

// layout/inc_toolbar.xml

// 引入了android.support.v7.widget.Toolbar这个控件

// 引用了@style/Toolbar

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/toolbar"

style="@style/Toolbar"/>

// @style/Toolbar的样式

// 1、android:layout_height建议设置为wrap_content

// 2、android:minHeight设置为?attr/actionBarSize

// 3、android:fitsSystemWindows设置为true

match_parent

wrap_content

?attr/actionBarSize

?attr/colorPrimary

true

@style/ThemeOverlay.AppCompat.Dark.ActionBar

@style/ThemeOverlay.AppCompat.Light

3)在activity_home对应的ActivityHome.java文件中:

// 必须要找到这个Toolbar组件,然后调用setSupportActionBar方法,否则会出现Toolbar各种显示不正确的问题

/**

* 「必须在 Application 的 onCreate 方法中执行

* BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回」

*/

public class ActivityHome extends BaseActivity {

@BindView(R.id.toolbar)

Toolbar mToolbar;

// 首页不需要支持滑动返回,重写该方法永久禁用当前界面的滑动返回功能

@Override

public boolean isSupportSwipeBack() {

return false;

}

@Override

protected int getLayoutId() {

return R.layout.activity_home;

}

@Override

protected void initView() {

setSupportActionBar(mToolbar);

}

@Override

public void onBackPressed() {

finish();

}

}

4)在BaseActivity.java中

我们通过判断当前sdk_int大于4.4(kitkat),则通过代码的形式设置status bar为透明(这里其实可以通过values-v19 的sytle.xml里设置windowTranslucentStatus属性为true来进行设置,但是在某些手机会不起效,所以采用代码的形式进行设置)。还需要注意的是我们这里的AppCompatAcitivity是android.support.v7.app.AppCompatActivity支持包中的AppCompatAcitivity,也是为了在低版本的android系统中兼容toolbar。

// 下面设置status bar透明的代码段中Build.VERSION_CODES.KITKAT = 19,

// 也就是SDK 为4.4的版本,大于4.4以上的状态栏设置为透明状态;

// 这也就是为什么本文开头演示的【效果1】status bar为不透明的情况。

@Override

protected void onCreate(Bundle savedInstanceState) {

LogUtils.d(TAG, "【 " + TAG + " 】:onCreate---");

// 在 super.onCreate(savedInstanceState) 之前调用该方法

initSwipeBackFinish();

super.onCreate(savedInstanceState);

ActivityManager.getInstance().setCurrentActivity(this);

BBApp.addActivity(this);

// 隐藏状态栏

if (getFullScreen()) {

int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;

this.getWindow().setFlags(flag, flag);

}

// 获取layoutId

int layoutId = getLayoutId();

if (layoutId != 0) {

// 初始化

initialize();

// 设置布局

setContentView(layoutId);

// ButterKnife初始化

ButterKnife.bind(this);

// 删除窗口背景

getWindow().setBackgroundDrawable(null);

// 初始化数据

initData();

// 初始化视图组件

initView();

// 初始化事件

setListener();

}

//状态栏透明化: 侵入式透明status bar

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

Window window = getWindow();

// Translucent status bar

window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager

.LayoutParams.FLAG_TRANSLUCENT_STATUS);

}

// 是否夜间模式

if (SharedPreferenceManager.getIsNight(this)) {

isNight = true;

} else {

isNight = false;

}

}

优点为:

使用fitSystemWindows属性让系统帮我们自动适配不同情况下的status bar,让我们的view的paddingTop获取到一个合理的值。

缺点为:就是在4.3版本及以下版本的状态栏状态栏status bar区域背景不是透明色,为黑色。

下面第二种方式在4.4版本以下状态栏一直保持为透明色

未完待续~~~~~

android数据库侵入,Android中实现侵入式状态栏的两种方式相关推荐

  1. shell 不等于_关于shell编程中的整数值比较的两种方式的简单操作实例

    谈一谈关于shell编程中的整数值比较的两种方式 Shell编程有时处理一个对象时,需要我们对对象进行测试. 只有符合要求的才采取下一步操作,这样做的好处可以避免程序出错. 这个测试的对象可以是文件. ...

  2. DLL中导出函数的声明有两种方式

    本文引用自:VC编程时DLL中导出函数的声明有两种方式 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链 ...

  3. C++类中成员变量的初始化有两种方式

    C++类中成员变量的初始化有两种方式: 构造函数初始化列表和构造函数体内赋值.下面看看两种方式有何不同. 成员变量初始化的顺序是按照在那种定义的顺序. 1.内部数据类型(char,int--指针等) ...

  4. c语言返回二叉树的大小,C语言中计算二叉树的宽度的两种方式

    C语言中计算二叉树的宽度的两种方式 二叉树作为一种很特殊的数据结构,功能上有很大的作用!今天就来看看怎么计算一个二叉树的最大的宽度吧. 采用递归方式 下面是代码内容: int GetMaxWidth( ...

  5. python循环展示大写字母_python调用大写函数python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  6. python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  7. C语言中存储多个字符串的两种方式

    C语言中存储多个字符串的两种方式 方式一 二维字符串数组 声明: char name[4][10] = { "Justinian", "Momo", " ...

  8. Android 7.1 增加屏幕边缘滑动事件(手势滑动)两种方式(Back,Home,Menu功能键) 免开启无障碍功能

    目前公司在做新项目开发,项目目前是不让有Back,Home,Menu实体按键,这就导致了一个问题,点开其它应用无法返回到桌面, 当然些问题对于做开发的我们肯定是难不到的,如果我们开发碰到这问题肯定是a ...

  9. VISIONPRO中使用工业相机采集图像的两种方式分享

    在VisionPro中,使用工业相机采像的方式主要有两种: 通过调用CogAcqFifoTool工具的方式取像 通过实现 ICogAcqFifo接口获取图像 通过CogAcqFifoTool工具取图: ...

最新文章

  1. 基于颜色特征,形状特征和纹理特征的数字图像的检索(Digital Image Retrieval)MATLAB GUI实现(本科毕业设计)
  2. DNN安装报错-The stored procedure 'dbo.GetPortalAliasByPortalID' doesn't exist.如何解决
  3. 学java时的一些笔记(2)
  4. 51Nod 1003 阶乘后面0的数量(数学,思维题)
  5. python mock_Python中使用mock.Mock()进行mock测试
  6. 宇视硬盘录像机onvif_视频监控系统中强大的录像机,兼容不同品牌,看看有哪些监控厂家...
  7. 华为acl怎么生效_华为ACL配置教程(一)
  8. android中间隔执行程序,Android:在SeekBar中设置间隔
  9. pandas重新设置列索引_python数据分析包Pandas(一)
  10. python规范模块和包
  11. Nginx 用户认证
  12. websphere 启动出错 检查节点 上服务器的日志_启动Redis Sentinel哨兵
  13. day20: zip压缩工具及打包工具介绍
  14. 重启mysql tomcat_linux下MySQL、Tomcat、Redis、Nginx停止和重启
  15. 【小5聊】HBuilderX下载与简单的Web端浏览器插件开发
  16. 什么是VB.NET?
  17. 用scrapy爬虫无数据
  18. Ubuntu安装jdk-8u201-linux-x64.tar.gz
  19. RTI DDS 01
  20. effective c++ 23NVI手法

热门文章

  1. 王者服务器维护8月四日,8月4日体验服停机更新公告
  2. 贩妖记 第六十九章,沈教授
  3. 亚马逊开店用好云服务器,避免各种坑
  4. 7-2 求玉米亩产量
  5. mysql双机灾备_MySQL全方位灾备保护 Ⅱ 逻辑备份
  6. TLA+ TLC模型检查器使用指南(持续更新中)
  7. CVPR2020:D2Det论文解读
  8. CentOS下NFS服务器配置实例
  9. 如何用Excel把两列文字合并到一起
  10. 前端行为层,表示层,结构层的分离