全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

分别用ToolBar和自定义导航栏实现沉浸式状态栏

一、ToolBar

1、在build.gradle中添加依赖,例如:

compile 'com.android.support:appcompat-v7:23.4.0'

2、去掉应用的ActionBar。可以是修改主题theme为“NoActionBar”,例如:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

或者不修改主题为"NoActionBar",而在主题的style下,添加:

 <item name="windowNoTitle">true</item>
 <item name="windowActionBar">false</item>

第二个属性代表是否用ActionBar代替TitleBar。

其实,刚学的时候,感觉很纳闷,怎么又多了个TitleBar?后来查了很久才发现,3.0以前,状态栏下面的是标题栏(只能显示标题等少量信息),3.0以后就变成了应用栏,也就是ActionBar。

另外,我测试的时候,activity是继承于AppCompatActivity,主题是AppCompat类型的。这种情况下,必须要像上面那样写才有效果,少写或值不同的话,要么没效果,要么报错。

最后,上面两个属性的说明可在android.R.attr这个类中查看。

3、在xml中为ToolBar添加属性

 android:fitsSystemWindows="true"
 android:minHeight="?attr/actionBarSize"

fitsSystemWindows是ToolBar实现沉浸式状态栏的关键,其大概情况是,如果设为true,就会调整这个view去留一些空间给系统窗口,如果不设置或设为false,ToolBar就会和状态栏重叠在一起。

而第二个属性中,它的值全写是"?android:attr/actionBarSize",其意思是引用当前主题中的actionBarSize这个属性。更多相关说明可查看官方文档中Accessing Resources的部分。

上面两个属性可在android.view.View这个类中查看。

4、在java中添加判断sdk版本的代码并在用户的系统是4.4及以上时设置状态栏为透明

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

无论是ToolBar,还是自定义导航栏,这个操作都是实现沉浸式状态栏的关键。

因为设置状态栏为透明的这个属性,要4.4以上才能使用,所以4.4以下的系统是不能够实现沉浸式状态栏的。而在4.4到5.0的系统中,状态栏是全透明的,也就是它的颜色会跟你的ToolBar和自定义导航栏的颜色一样。而在5.0以上的系统中,则是半透明的,也就看起来会比较深暗。

而我在6.0的系统上测试时,发现这一步没设置和设置了的,从效果上看,区别就是没设置时状态栏颜色浅一点,而且ToolBar的padding top为0,而设置了的颜色就深一点,padding top为状态栏的高度。具体有什么影响,还不清楚。但这会让自定义导航的外观变形,它会增加状态栏的高度,但又没有让这部分与状态栏重叠,就导致效果变形。

5、最后在java中添加

setSupportActionBar(mToolbar);

ToolBar的布局代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:id="@+id/tool_bar"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="@color/colorPrimary"
 android:elevation="4dp"
 android:fitsSystemWindows="true"
 android:minHeight="?android:attr/actionBarSize"
 app:title="ToolBar"
 app:subtitle="toolbar"/>

 效果图(Android 6.0):

二、自定义导航栏TopBar

1、设置窗口为无标题,上面第2步中的两个方法都可以实现,或者是在java中添加如下代码:

requestWindowFeature(Window.FEATURE_NO_TITLE);

注意在添加这句代码时,确保是在加载布局内容之前,也就是onCreate的setContentView之前。在《Android群英传》“Android控件架构”,这一节中解释了为什么requestWindowFeature()需要在setContentView()之前。

另外,我发现如果该activity是继承AppCompatActivity的话,只写上面的这句代码是没有变化的,显示的还是ActionBar。但如果是继承FragmentActivity的话,就有效果,也就说上面第2步中的第二个方法,只添加其中任意一个属性都是可以的。至于是什么原因,我还没弄清楚。

2、同上面第4步,判断系统版本并按需设置状态栏为透明

3、获取状态栏的高度

protected int getStatusHeight() {
 try {
 Class<?> c = Class.forName("com.android.internal.R$dimen"); // 获得与字符串对应的Class对象
 Object object = c.newInstance(); // 创建这个Class的实例对象
 Field field = c.getField("status_bar_height"); // 拿到字符串对应的变量
 int x = Integer.parseInt(field.get(object).toString()); // 通过这个实例对象拿到这个变量的值,再转换类型,最后转为整型,变为一个资源id
 return getResources().getDimensionPixelSize(x);
 } catch (Exception e) {
 e.printStackTrace();
 }
 return 0;
}

这部分代码是利用Java的反射机制来实现的,因为这个internal包默认会被sdk/platforms/android-version中的android.jar给移除掉,所以无法直接调用或查看这个包中的类。如果要使用的话,可以借助这个开源项目https://github.com/anggrayudi/android-hidden-api。

4、获取自定义TopBar的高度并修改布局参数

protected void setStatusBar() {
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
 final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.top_bar);
 final int statusHeight = getStatusHeight();
 viewGroup.post(new Runnable() {
  @Override
  public void run() {
  int topBarHeight = viewGroup.getHeight();
  LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) viewGroup.getLayoutParams();
  layoutParams.height = statusHeight + topBarHeight;
  viewGroup.setLayoutParams(layoutParams);
  }
 });
 }
}

因为在include这个TopBar的布局文件中,其父布局是LinearLayout,而TopBar的父布局是RelativeLayout,所以这里先要转成ViewGroup,等getLayoutParams时,再转成LinearLayout.LayoutParams。

TopBar的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/top_bar"
 android:layout_width="match_parent"
 android:layout_height="49dp"
 android:background="@color/colorPrimary"
 android:gravity="bottom">
 <RelativeLayout
 android:layout_width="match_parent"
 android:layout_height="49dp">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:text="@string/app_name"
  android:textSize="24sp"
  android:textColor="#ffffff"/>
 </RelativeLayout>
</RelativeLayout>

因为这个布局的高度会在代码中动态地修改,即49dp加上状态栏的高度,所以只有一个层级的结构的话,那导航栏的内容就会往上偏。所以要嵌套多一层来维持导航栏的高度,同时在最外层的布局中,添加android:gravity="bottom"这个属性来保证导航栏不往上偏。

效果图(Android 6.0):

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# 沉浸式状态栏  # toolbar沉浸式  # 微软IE Developer Toolbar安装使用简要图文说明  # jquery toolbar与网页浮动工具条具体实现代码  # Java Swing中的工具栏(JToolBar)和分割面版(JSplitPane)组件使用案例  # Toolbar制作菜单条过程详解  # iOS应用中使用Toolbar工具栏方式切换视图的方法详解  # iOS中的导航栏UINavigationBar与工具栏UIToolBar要点解析  # Android5.0+ CollapsingToolbarLayout使用详解  # Android自定义ActionProvider ToolBar实现Menu小红点  # Android自定义Toolbar使用方法详解  # 深入理解Android 5.0中的Toolbar  # 状态栏  # 自定义  # 就会  # 而在  # 第二个  # 都是  # 是在  # 也就  # 设为  # 这部  # 可在  # 往上  # 这句  # 转成  # 类中  # 的是  # 有什么  # 我在  # 就有  # 则是 


相关文章: 如何规划企业建站流程的关键步骤?  为什么Go需要go mod文件_Go go mod文件作用说明  建站VPS选购需注意哪些关键参数?  如何在IIS中新建站点并解决端口绑定冲突?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何选择建站程序?包含哪些必备功能与类型?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  C++如何编写函数模板?(泛型编程入门)  建站之星2.7模板快速切换与批量管理功能操作指南  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  已有域名如何快速搭建专属网站?  建站主机是否属于云主机类型?  在线教育网站制作平台,山西立德教育官网?  建站之星如何一键生成手机站?  如何在腾讯云服务器快速搭建个人网站?  高端云建站费用究竟需要多少预算?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何选购建站域名与空间?自助平台全解析  动图在线制作网站有哪些,滑动动图图集怎么做?  如何选择高效稳定的ISP建站解决方案?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  网页设计网站制作软件,microsoft office哪个可以创建网页?  网站企业制作流程,用什么语言做企业网站比较好?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何快速打造个性化非模板自助建站?  如何通过商城自助建站源码实现零基础高效建站?  代购小票制作网站有哪些,购物小票的简要说明?  如何在阿里云通过域名搭建网站?  建站之星会员如何解锁更多建站功能?  想学网站制作怎么学,建立一个网站要花费多少?  如何用狗爹虚拟主机快速搭建网站?  开心动漫网站制作软件下载,十分开心动画为何停播?  如何选择网络建站服务器?高效建站必看指南  Android自定义listview布局实现上拉加载下拉刷新功能  如何在Golang中引入测试模块_Golang测试包导入与使用实践  贸易公司网站制作流程,出口贸易网站设计怎么做?  微信推文制作网站有哪些,怎么做微信推文,急?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  小型网站制作HTML,*游戏网站怎么搭建?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  建站主机数据库如何配置才能提升网站性能?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  大型企业网站制作流程,做网站需要注册公司吗?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  定制建站如何定义?其核心优势是什么?  如何零基础在云服务器搭建WordPress站点?  黑客入侵网站服务器的常见手法有哪些?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  建站之星安装后界面空白如何解决? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。