薄荷Toolbar(ActionBar)的适配方案
一晃好久没更新了,最近的几个月确实非常忙,公司在准备C轮融资的事情,而我自己也在全力在我负责的业务上冲刺,好在现在来看C轮进入尾声,各项目进展还算顺利。之前很久之前就准备分享的一篇我们薄荷App上的一个Toolbar的适配方案,大家有福了,绝对原创,你在别的地可找不到,这里分享出来。
背景
在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版就知道了
2. 全局替换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.
3. 最后在values-v19文件夹下声明AppTheme为透明状态栏,代码如下
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:windowTranslucentStatus">true</item>
</style>
这句话意为在api大于等于19以上版本为状态栏透明
以上便解决了第一个问题,那么接下来第二个问题的解决方案就是抽象成一个BaseActivity,直接上代码相信大家就明白了。
package com.stormzhang.booheetoolbar;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
public class BaseActivity extends AppCompatActivity {
private LinearLayout rootLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 这句很关键,注意是调用父类的方法
super.setContentView(R.layout.activity_base);
// 经测试在代码里直接声明透明状态栏更有效
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
}
initToolbar();
}
private void initToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
}
}
@Override
public void setContentView(int layoutId) {
setContentView(View.inflate(this, layoutId, null));
}
@Override
public void setContentView(View view) {
rootLayout = (LinearLayout) findViewById(R.id.root_layout);
if (rootLayout == null) return;
rootLayout.addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
initToolbar();
}
}
而activity_base.xml的布局内容如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/toolbar_layout" />
</LinearLayout>
这里需要强调的是BaseActivity里的这段内容
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
}
其实和在主题样式里声明
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:windowTranslucentStatus">true</item>
</style>
是一个意思,但是实际测试中发现在国产某些rom上,xml声明的会不起作用,所以建议在代码里直接声明更有效。
最后每一个Activity或者Fragment只需要调用getSupportActionBar()方法,均和ActionBar的使用方法一致。
最后我这边写了一个完整的demo放在GitHub供大家理解使用。
GitHub地址:
https://github.com/stormzhang/BooheeToolbar
后续
最后预告下,最近项目彻底对网络库进行了重构,对网络的理解以及网络层的设计又有了新的认识,下次抽时间总结分享给大家,敬请期待。
‘阅读原文’跳转到个人博客,如果觉得内容很不错,不如帮我分享出去为我增加一些读者,也让我的个人分享更有动力,谢谢大家!
薄荷Toolbar(ActionBar)的适配方案相关推荐
- 安卓屏幕适配方案(根据今日头条方案,升级版)
前言 屏幕适配方案有很多,比如原生的dp,鸿洋大神的AutoLayout,宽高限定符,今天我用缺点比较小的今日头条方案 头条适配方案的文章链接:https://mp.weixin.qq.com/s/d ...
- python壁纸超清全面屏_iOS 关于全面屏适配的方案及UI在不同尺寸下适配方案
iOS 关于全面屏适配的方案及UI在不同尺寸下适配方案 前言 全面屏刚出时,网上有说反人类.但过去这么久了,趋于技术的进步或看久了,大家也都慢慢习惯了(只是笔者还是买不起全面屏).官方适配中文版文档也 ...
- iOS 关于全面屏适配的方案及UI在不同尺寸下适配方案
前言 全面屏刚出时,网上有说反人类.但过去这么久了,趋于技术的进步或看久了,大家也都慢慢习惯了(只是笔者还是买不起全面屏).官方适配中文版文档也出来了. 图源:( baijiahao.baidu.co ...
- android 沉浸式状态栏 兼容低版本,Android 沉浸式状态栏适配方案
首先说下什么是沉浸式状态栏:这是android4.4以后开始支持的一种效果,状态栏不再是一个黑条,而是置为透明或者半透明,然后页面延伸到状态栏下面,这样状态栏区域也可以成为app页面显示区域的一部分, ...
- 【cocos2d-x 手游研发小技巧(3)Android界面分辨率适配方案】
先感叹一下吧~~android的各种分辨率各种适配虐我千百遍,每次新项目我依旧待它如初恋···· 每家公司都有自己项目工程适配的方案,这种东西就是没有最好,只有最适合!!! 这次新项目专项针对andr ...
- Android屏幕适配框架-(今日头条终极适配方案)
2019独角兽企业重金招聘Python工程师标准>>> 在Android开发中,屏幕适配是一个非常头痛的问题,因而为了去进行屏幕适配,作为程序员,是呕心沥血,历经磨难,哈哈 我们之前 ...
- Android8.0运行时权限策略变化和适配方案
版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com Android8.0也就是Android O即将要发布了,有很多新特性,目前我们可以通过Android ...
- 全面屏适配方案,终极版,华为隐藏导航栏解决方案
全面屏适配方案,终极版,华为隐藏导航栏解决方案 参考文章: (1)全面屏适配方案,终极版,华为隐藏导航栏解决方案 (2)https://www.cnblogs.com/lizhanqi/p/93371 ...
- Android 8.0 运行时权限策略变化和适配方案
Android8.0也就是Android O即将要发布了,有很多新特性,目前我们可以通过AndroidStudio3.0 Canary版本下载Android O最新的系统映像的Developer Pr ...
- 今日头条屏幕适配方案落地研究
目录 前言 各平板数据比较 为什么看起来更小了?(头条方案跟最小宽度方案比较) smallesWidth 方案迁移 优缺点 issue 附录(适配核心代码) 前言 大家好,现在给大家推荐一种极低版本的 ...
最新文章
- 浅析Linux IO
- 零基础入门学习Python(8)-了不起的分支和循环3
- OGEngine开源引擎环境搭建
- 人工智能之自然语言的从新思考
- java的排序_java排序
- Python-OpenCV 笔记4 -- 形态学操作(Morphological Operations)
- c语言如何判断数据是否符合正态分布_如何判断机器学习数据集是否是线性的?...
- Oracle 12C -- 预定义audit policies
- linux的dhcp配置命令,Linux下DHCP配置命令
- 一次性解决所有需求变更相关的问题(赠需求变更管理流程图)
- 为什么Windows鼠标指针是弯的?
- 浏览器检测是否支持webrtc(看看你的浏览器能不能h5视频)
- 【Java设计模式 经典设计原则】 八 经典设计原则小结
- 使用canvas画三角形,圆形,半圆,八卦
- [Hadoop性能调优]
- Android实现应用的增量更新\升级
- win10右键卡顿原因_windows10鼠标点击右键出现卡顿如何解决
- hdfs的学习和高可用部署
- 边缘检测,Roberts 算子,Sobel算子,Canny 算子
- php 断点续传,PHP实现断点续传