博客源址:http://stormzhang.com/android/2015/08/16/boohee-toolbar/ 2015 年 08 月 16 日

一晃好久没更新博客了,最近的几个月确实非常忙,公司在准备C轮融资的事情,而我自己也在全力在我负责的业务上冲刺,好在现在来看C轮进入尾声,各项目进展还算顺利。之前很久之前就准备分享的一篇我们薄荷App上的一个Toolbar的适配方案,这里分享出来。

另外先打个广告,以后博客更新准备第一时间更新在我的微信公众号: AndroidDeveloper 上,方便大家第一时间通知到大家,大家可以扫码关注下。

背景

在Toolbar刚出来不久,我就准备尝鲜并准备在薄荷Android版把ActionBar全部替换到Toolbar。至于Toolbar的优势以及它的使用方法我这里就不一一介绍了,网上一大堆。这里经过评估发现Toolbar的适配有以下几个难点:

  1. 遵循各版本的Android设计

我们的App一向是尽量遵循Android的设计,比如顶部的导航栏,我们知道在4.4版本之前Android是不可以自定义状态栏的,在4.4版本Android推出了一个透明状态栏的概念,使手机最顶部的状态栏的颜色全透明,并且颜色可以定义,而5.0推出了Material Design,这个时候的状态栏就变成了半透明的颜色,具体可见下图。

4.4版本

5.0版本

而4.4之前版本顶部的状态栏默认是黑色的,这里就不截图了,看微信Android版就知道了

  1. 全局替换ActionBar

我们知道ActionBar默认在是每个页面包含了,而Toolbar是需要你手动写一个布局然后include进去的,如果想要全部替换成Toolbar,则需要改动每一个布局文件,这样改动难免太大了。

一键适配所有版本的状态栏

我们先来解决第一个问题,这里也是经过自己研究利用的一个小技巧。废话不多说,直接上代码与解决方案。

  1. 首先Toolbar是在appcompact-v7包下面,所以第一步需要依赖该库,方式很简单,gradle依赖加入如下代码:

    compile ‘com.android.support:appcompat-v7:22.2.1’

  2. 之后我们创建一个Toolbar的布局文件toolbar_layout.xml

<?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/toolbar"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:paddingTop="@dimen/toolbar_padding_top"    android:background="@color/primary_color"    android:minHeight="?attr/actionBarSize"    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

这里给它设一个id与你app的主颜色,然后关于其他属性android:minHeight、app:theme、app:popupTheme等就不在解释,关键是在这里加了一个paddingTop的属性。看到这里可能已经有同学猜到我的解决方案了,是的解决方案就是利用状态栏的高度,在4.4以上的版本给Toolbar设置一个paddingTop的属性为status_bar的高度,然后让他“全屏”,Toolbar就自然的延伸到了status_bar的位置,而且在4.4系统status_bar默认就是透明,在5.0以上status_bar是半透明。而至于status_bar的高度从源码查看得知为25dp,不信的话大家可以通过以下代码获取像素转成dp试试

public int getStatusBarHeight() {      int result = 0;    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");    if (resourceId > 0) {        result = getResources().getDimensionPixelSize(resourceId);    }    return result;}  

然后我们还需要在values, values-v19两个文件夹下分别声明toolbar_padding_top变量,values文件夹下值为0,而values-v19文件夹下值为25.

  1. 最后在values-v19文件夹下声明AppTheme为透明状态栏,代码如下
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">    

更多相关文章

  1. Android实战技巧之四十五:复用原有C代码的方案
  2. 【Android Studio快捷键】之导入相应包声明(import packages)
  3. 【源码】android新闻日报源码、android 企业级erp商业应用源码、
  4. 这本《第三行代码》,让大家久等了!
  5. 《第一行代码Android》读书笔记
  6. Android NDK开发篇(六):Java与原生代码通信(异常处理)
  7. android代码混淆个人总结及踩坑
  8. android studio 3.x 以上版本的Native JNI/NDK 调用c++/c语言程
  9. Android各版本查询和开启悬浮窗权限

随机推荐

  1. osg for android 学习之十五:显示图片
  2. Android(安卓)4.4 Kitkat Phone工作流程
  3. Android实现网络访问
  4. Android(安卓)theme 使用
  5. Andriod EditText 属性学习
  6. 天天记录 - Android(安卓)使用view.Scrol
  7. Bitmap Drawable相互转换
  8. 【Android】Eclipse报This version of th
  9. Android时间选择器和日期选择器的使用注
  10. Android(安卓)OpenGL ES 绘图 -- 热力图