什么是快速开发嘞,看这个效果

然而我只用了这么几行代码:

activity_main.xml 里面什么也没有!

其实说白了哈,就是我把 TopBar 封装在 TopBarBaseActivity 里面,然后 MainActivity 只需 继承 TopBarBaseActivity 即可。 你想一想,以后每个上面有 TopBar 的界面,只需 让你的 XXActivity extends TopBarBaseActivity,就可以随意的设置你的 TopBar 了,多爽啊!。

下面跟着我一步一步的实现我们想要的 TopBarBaseActivity。

2开始

(1)依赖 appcompat-v7

新建一个项目,因为 Toolbar 是在 appcompat-v7 包下,所以确保已经依赖 appcompat-v7。

如果没有请加上,例如:

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

(2)设置 NoActionBar 主题

由于我们使用 Toolbar 代替 ActionBar,所以先把 ActionBar 去掉,我们通过设置 Application 的 theme 来隐藏,这样项目中所有的界面的 ActionBar 就都隐藏了。

先修改 style.xml 中的 AppTheme 继承自

Theme.AppCompat.Light.NoActionBar

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>

AndroidManifest.xml 文件中默认就会设置主题的

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
...
</application>

(3)创建 TopBarBaseActivity

new 一个项目之后会默认创建一个 MainActivity.java 和 activity_main.xml ,然后我们再自己新建两个文件 TopBarBaseActivity.java 和 activity_base_top_bar.xml

然后 TopBarBaseActivity 继承 AppCompatActivity,MainActivity 继承 TopBarBaseActivity

(4)把 TopBar 封装在 TopBarBaseActivity

首先我们在 activity_base_top_bar.xml 中 添加 Toolbar,然后在 TopBarBaseActivity 中获取并初始化设置 Toolbar

到这里,MainActivity 和 TopBarBaseActivity 还是显示它们各自自己的布局,所以我们要实现让 MainActivity 的布局 显示在 TopBarBaseActivity 的布局中,我们先在 activity_base_top_bar.xml 中添加一个 FrameLayout ,这样我们就可以把 MainActivity 的布局解析到 FrameLayout 里面

然后我们修改下 TopBarBaseActivity

注意:为了设置两个抽象方法,我们将 TopBarBaseActivity 设置成了抽象类。

接下来让我们的 MainActivity 自动实现两个父类的抽象方法、删掉 onCreate 方法,并通过 getContentView 方法返回布局 activity_main 的 id。

现在你运行一下项目,我们并没有在 MainActivity 的布局中添加 ToolBar,但是运行出来的效果是 Toolbar 已经存在了。

(5)实现一句话添加标题

接下来我们要实现在 MainActivity 里面 setTitle("标题");一句话设置标题。

首先我们修改 activity_base_top_bar.xml 布局文件,在 Toolbar 中添加一个 TextView 用来显示标题

再修改 TopBarBaseActivity 添加一个 setTitle 方法

然后我们就可以在 MainActivity 中调用了 setTitle 方法了

效果图:

(6)实现一句话添加左上角按钮

接下来我们的目标是通过在 MainActivity 中 一句话 实现自定义 TopBar 左上角的 图标 和 点击监听

首先修改 TopBarBaseActivity, 我们需要造一个接口并声明

接下来我们就可以在 MainActivity 中这样写

运行一下试试是不是只需一句话就设置了 TopBar 左按钮的 图标 和 点击事件 !

(7)实现一句话添加右上角按钮

先创建一个 menu 文件夹和一个 menu 资源文件

内容是这样的:

继续修改 TopBarBaseActivity ,添加如下代码:

现在我们再 MainActivity 调用 setTopRightButton 方法的姿势是这样的

现在运行看下效果

到这里我们的 TopBarBaseActivity 就封装完了,过程比较简单,重要的是这个封装的思路,其实还有很多我们常用的布局都是可以进行封装的。

最后

可能有些人还会有些疑问:为什么要用 ToolBar 进行封装呢,自己写一个 TopBar 不是更好吗?

是的,如果你用不惯 Toolbar 你就可以根据自己的习惯写一个扩展性更好的 TopBar。但是我觉得 Toolbar 其实也有一些优质的特点的:

  • 官方提供,符合标准,界面统一。

  • 自带点击效果。

  • 自带点击热区。

封装一个 TopBarBaseActivity的更多相关文章

  1. 自己封装一个Log模块

    Unity自己有log系统,为什么要自己封装一个 1.不好用,只能在pc上记录log文件,移动平台是没有的 2.在开发时期的log,不想在正式版里面出现.没有一个统一的开关来控制是不是要显示log,要 ...

  2. PHP封装一个通用好用的文件上传处理类

    封装一个文件上传类完成基本功能如下: 1.可上传多个或单个文件 2.上传成功返回一个或多个文件名 3.上传失败则返回每个失败文件的错误信息 上传类中的基本功能: 1.构造参数,用户可以自定义配置参数, ...

  3. Swift - 简单封装一个工具类模板

    创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...

  4. 使用xib封装一个自定义view的步骤

    使用xib封装一个自定义view的步骤 1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView) 2> 新建一个MJAppView.xib文件来描述MJAppVi ...

  5. yii2封装一个类控制div宽度,高度

    1.首先,封装一个类,放在文件夹vendor下,命名为articls.php. <?phpclass Articles{ //测试    function add()    {        r ...

  6. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  7. IOS中封装一个View的思路

    一.封装一个View的思路 1.将View内部的业务逻辑(显示内容)封装到View中 2.一般情况下,View的位置应该由父控件来决定,也就是位置不应该固定死在View内部 3.至于View的宽高,根 ...

  8. 使用libzplay库封装一个音频类

    装载请说明原地址,谢谢~~      前两天我已经封装好一个duilib中使用的webkit内核的浏览器控件和一个基于vlc的用于播放视频的视频控件,这两个控件可以分别用在放酷狗播放器的乐库功能和MV ...

  9. 简易封装一个带有占位文字的TextView

    在实际iOS应用开发中我们经常会用到类似于下图所示的界面,即带有占位文字的文本框:

随机推荐

  1. Andrew Ng机器学习第五章——多变量线性回归

    一.多变量线性回归的技巧之一——特征缩放 1.为什么要使用特征缩放? 特征缩放用来确保特征值在相似的范围之内. 设想这样一种情况(房价预测),两个特征值分别是房子的大小和卧室的数量.每个特征值所处的范 ...

  2. 【GDKOI2017】 两个胖子萌萌哒 小学奥数题

    题目大意:给你一个$n\times m$的网格,你要在这个网格上画三角形. 三角形的顶点只能在网格的整点上,且至少有一条边平行于$x$或$y$轴,且三角形面积为整数.问你能画多少个不同的三角形. 两个 ...

  3. 【qboi冲刺NOIP2017复赛试题4】 全套题目+题解+程序

    作为一个好人(验题人),我给大家奉上下这套题的题解,并且预祝大家这套题能够AK: T1题面:Alice现在有n根木棍,他们长度为1,2,3....n,Bob想把某一些木棍去掉,使得Alice剩下的木棍 ...

  4. js集合set类的实现

    js集合set类的实现 /*js集合set类的实现*/ function Set() { this.dataStore = []; this.add = add;//新增元素 this.remove ...

  5. 剑指offer四十三之左旋转字符串

    一.题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...

  6. 学生信息管理系统-顺序表&&链表(数据结构第一次作业)

    实验目的 : 1 .掌握线性表的定义: 2 .掌握线性表的基本操作,如建立.查找.插入和删除等. 实验内容: 定义一个包含学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有如下功能: (1) 根 ...

  7. Dubbo-使用Maven构建Dubbo服务的可执行jar包

    一.为什么要构建Dubbo服务的可执行jar包? 1.1 Dubbo服务运行方式比较 ✎使用Servlet容器运行(Tomcat.Jetty等)  ---不可取 --缺点:增加复杂性(多了容器的端口) ...

  8. 弱网测试--使用fiddler进行弱网测试

    弱网测试原理以及方法(一) 一.为什么要进行弱网测试? 按照移动特性,各种网络连接协议不同,导致通信的信号不同,速率也不同,影响应用的加载时间.可用性.稳定性 二.什么样的网络属于弱网? 低于2g速率 ...

  9. 《Android应用性能优化》2——内存、CPU、性能测评

    4.高效使用内存 4.1 说说内存 Android设备的性能主要取决于以下三因素: CPU如何操纵特定的数据类型: 数据和指令需占用多少存储空间: 数据在内存中的布局 4.2 数据类型 int和lon ...

  10. epoll—IO多路复用

    1.在socket.listen()后创一个epoll对象   epoll = select.epoll() 2.将server_socket注册到epoll中        epoll.regist ...