在API21之前我们使用标题栏基本都是在ActionBarActivity的Activity中处理的,而API21之后,谷歌遗弃了ActionBarActivity,推荐我们也可以说是强制我们使用AppCompatActivity,然而ActionBarActivity与AppCompatActivity的使用大同小异,下面我们将介绍最新的Activity组件之AppCompatActivity的使用,最后的效果与微信和支付宝等基本相同,图如下:

1.初探AppCompatActivity

我们按照AndroidStudio的默认顺序创建项目,默认Activity继承自AppCompatActivity。代码如下:

public classMainActivityextendsAppCompatActivity {@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}

运行提到如下所示的界面:

其结果与继承自Activity并无二致,丑爆了。下面我们来一步一步扩展其标题栏,让他的内容更丰富多彩。

2.AppCompatActivity与Toolbar结合

其实我们并不是要使用AppCompatActivity自带的标题栏,那样扩展会很麻烦,在14年的Android 5.0的时候就用Toolbar替代了ActionBar,而ActionBarActivity又被AppCompatActivity替代,那么使用方法就是引入Toolbar设置到Activity中。

㈠首先我们必须在配置文件中,写入Toolbar,代码如下:

解释①android:minHeight="?attr/actionBarSize":设置标题栏最小高度为ActionBar的高度。

解释②android:background="?attr/colorPrimary":该主题下的主色。也就是默认的灰色。

我们知道在AndroidManifest.xml清单文件下application中设置了android:theme="@style/AppTheme"而查看AppTheme看到如下样式

从名字我们就可以看出来,默认的标题栏为黑色。我们使用了toolbar就必须修改样式文件,将原来的标题栏去掉,修改后的样式文件如下:

如下这个时候运行,那么你将看到界面也是没有标题栏的,因为你并没有设置到AppCompatActivity中去。

㈡将Toolbar显示到界面

我们创建一个方法名为initActionBar(),首先当然是获取ToolBar控件,然后将Toolbar设置到Activity中去。代码如下:

public voidinitActionBar() {    Toolbar toolbar = (Toolbar) findViewById(R.id.activity_main_toolbar);setSupportActionBar(toolbar);}

现在运行,我们将得到如下界面:

依然不是你期待的效果,下面我们将介绍AppCompatActivity的细节。

3.AppCompatActivity详解

㈠设置title

我们可以看到,标题栏始终显示我们的项目名,这样显然给用户看是不理想的。那么怎么设置标题栏的字符串。我们可以在setSupportActionBar(toolbar)之前加入如下代码:

setTitle("liyuanjinglylyj");

此setTitle("liyuanjinglyj")是AppCompatActivity的方法,并不是toolbar的方法,那么我们运行一下程序将得到如下界面:

那么我们将刚才的AppCompatActivity的setTitle换成Toolbar的setTitle看看效果会怎么样,其实结果如上图一样,没有任何变化。

可能你希望title显示在中间,很遗憾,toolbar与AppCompatActivity并没有提供相关的方法,不过可以在toolbar中加入一个TextView,配置其属性,让其显示在最中间。

㈡设置回退按钮

假如我的这个界面并不是主界面,而是一个子界面,这个时候我有一个需求,需要回退到上一个界面那么怎么设置左边的图标并实现其方法。其实很简单,在setSupportActionBar(toolbar);后面加入如下代码:

toolbar.setNavigationIcon(R.drawable.back);toolbar.setNavigationOnClickListener(newView.OnClickListener() {@Overridepublic voidonClick(View v) {        finish();}});

为什么在setSupportActionBar(toolbar);后面加入而不在前面,你可以加入到前面试试,虽然可以显示回退的图片,但是点击并没有调用该按钮的点击事件,而在setSupportActionBar(toolbar);后面设置点击才有反应。一定要记住,不然回退是不会起作用的。

运行结果如下:

㈢设置logo

设置logo在标题栏并不少见,比如网易APP首页就的网易设置的logo,其实代码很简单,也仅仅需要一条代码即可,在setSupportActionBar(toolbar)前加入如下代码:

toolbar.setLogo(R.id.app_logo);

运行结果如下:

㈣设置副标题

在setSupportActionBar(toolbar)前加入如下代码::

toolbar.setSubtitle("liyuanjing");

运行界面后,如下:

㈤设置菜单

我们知道onCreateOptionsMenu是上下文菜单,同理可以直接在该方法中设置菜单,代码如下:

@Overridepublic booleanonCreateOptionsMenu(Menu menu) {    getMenuInflater().inflate(R.menu.menu_main,menu);return  true;}

此方法为Activity方法。因为你在上面已经讲Toolbar设置到了Activity中,所以默认也会显示到标题栏中,如果你觉得这样不习惯,那么你可以添加一条语句,不过这条语句添加不添加都没关系。

toolbar.setOnCreateContextMenuListener(this);

运行程序,如下图所示:

4.Toolbar的Style

3标题下的Toolbar是蓝色,且有很好Style,那么这是怎么设置呢,虽然我们这里重点是剖析Activity但是遇到有关Activity标题栏样式的还是要提到。

我们粗略的讲解上面的标题栏用到了哪些Style:

①#4876FF:如第一步直接在toolbar控件下面设置的属性一样,就是toolbar的颜色。

②#3A5FCD:状态栏颜色也就是标题栏上面的那个颜色,而我用的是小米1S测试的,其固件并没有很好的实现其功能,所以在该系统下并没有实现其效果。

③@android:color/white:窗口背景色,也就是Activity标题栏下面所有地方的颜色。

当我们设置了如上三个属性,那么效果图就如上面所示了,完整代码如下:

#4876FF#3A5FCD@android:color/white

5.Toolbar菜单样式

我们来看看如果直接使用上面的点击后边的菜单会有什么效果:

你有看到那个APP菜单弹出挡住了标题栏吗?,肯定没有吧,要是有的话,你肯定立即卸载了该应用了。

下面我们的任务就是将该菜单的样式和其他APP一样,在标题栏下面弹出。

首先要说明一下,toolbar菜单默认样式的父类为Widget.AppCompat.Light.PopupMenu.Overflow,那么要更改toobar中菜单的弹出的样式,就必须继承这个父类的样式。

其代码如下:

#4876FF#3A5FCD@android:color/white@style/LYJMenuStylefalse

设置这一个属性那么其弹出的样式就与其他APP一样不会覆盖标题栏。

还有其他属性这里简要说明一下:

①?attr/colorPrimary:弹出菜单背景色为标题栏的背景色

②0dip:弹出菜单与标题栏的垂直间距

将这两条加入LYJMenuStyle中就可以了实现如下图所示的弹出菜单:

最后介绍一下菜单里面重要的几个属性:

app:showAsAction有三个值:

always:总是显示在界面上

never:不显示在界面上,只让出现在右边的三个点中

ifRoom:如果有位置才显示,不然就出现在右边的三个点中

可以用 | 同时使用两个上面的值。

系统也为菜单提供了默认的分享菜单与查询菜单,代码如下:

app:actionViewClass="android.support.v7.widget.SearchView"

app:actionProviderClass="android.support.v7.widget.ShareActionProvider"

从名字想必不需要过多解释,最后一个就是显示的优先级,也就是显示的顺序,谁在最前面,谁在后面:

android:orderInCategory数值越小,显示靠前,且优先级最大

6、在你的AndroidStudio中新建一个activitiy继承AppCompatActivity 时,在你的activity_main XML文件中会出现一个android.support.design.widget.AppBarLayout,那么这个空间有什么作用呢?这就看出了AppCompatActivity 和之前的actionbarActivity 相比,强大的地方,actionbarActivity有的它全都有,而且还比actionbarActivity多出了很多的功能,兴许这就是google官方建议用此的原因吧,有关AppBarLayout且看 玩转AppBarLayout,更酷炫的顶部栏 这篇文章!

7、看到放出的效果图中溢出菜单中图片和文字一起显示出来了,默认是只能够显示文字,无论你在men xml文件中如何配置icon属性也不会显示图片出来的,后来发现原来是 点击溢出菜单时,回调方法onMenuOpened一直不执行!当然此时 菜单的添加方式是通过getMenuInflater().inflate(R.menu.main, menu);加载的,将菜单item写到menu目录下的xml文件中,通过这种方法,加载菜单的title,但是onMenuOpened并未执行,真是奇怪。

备注:如果菜单是通过下面方式添加的,还是可以执行的,从而也能添加溢出菜单中的图标,

setIconEnable(menu,true);

MenuItem item1 = menu.add(0,1,0, R.string.app_name);

item1.setIcon(R.drawable.ofm_qrcode_icon);

MenuItem item2 = menu.add(0,1,0, R.string.app_name);

item2.setIcon(R.drawable.ofm_feedback_icon);

returnsuper.onCreateOptionsMenu(menu);

但是这样麻烦啊,菜单不能通过xml来加载。

后来发现,虽然onMenuOpened方法不执行,但是onPrepareOptionsMenu(Menu menu)、onPrepareOptionsPanel(View view, Menu menu)等都可以执行,于是采用下面的方法:通过反射将其方法爆出来然后执行就可以了,代码如下:

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

if(menu !=null) {

if(menu.getClass().getSimpleName().equals("MenuBuilder")) {

try{

Method m = menu.getClass().getDeclaredMethod(

"setOptionalIconsVisible",Boolean.TYPE);

m.setAccessible(true);

m.invoke(menu, true);

}catch(Exception e) {

Log.e(getClass().getSimpleName(),"onMenuOpened...unable to set icons for overflow menu",e);

}

}

}

return super.onPrepareOptionsMenu(menu);

}

由此你就可以显现出入上图效果了,在溢出菜单中可以技能显示文字也能显示图标了

android21是什么意思,带你深度了解AppCompatActivity和Toolbar(Android21 )相关推荐

  1. 云原生游戏《云联物语》揭开神秘面纱 云鹭科技温向东带你深度了解云原生游戏领域...

    云原生游戏<云联物语>揭开神秘面纱 云鹭科技温向东带你深度了解云原生游戏领域 作者:阿姆斯特朗雷时间:2020-10-22 分享到: 10月21日,云鹭科技云游戏互动直播分享会在斗鱼直播平 ...

  2. 【降维打击,带你深度学习CPU(上)】

    系列文章目录 1.<带你深挖计算机底层逻辑,打通你计算机基础知识的任督二脉> 2.<深度学习计算机底层原理,深度剖析存储器> 3.<基于内存全面理解高速缓冲存储器> ...

  3. ZooKeeper只完美解决Unable to read additional data from server sessionid 0x0报错问题,并带你深度理解ZooKeeper内部机制之选举机制

    ZooKeeper只完美解决Unable to read additional data from server sessionid 0x0报错问题,并带你深度理解ZooKeeper内部机制之选举机制 ...

  4. 带你深度剖析《数据在内存中的存储》——C语言

    文章目录 一.数据类型介绍 二.整型在内存中的存储方式 2.1 原码.反码.补码的讲解 2.2 大小端介绍 2.2.1 大小端的概念 2.2.2 为什么要区分大小端存储呢? 2.2.3 大小端判断练习 ...

  5. 带你深度解锁Webpack系列(优化篇)

    带你深度解锁Webpack系列(优化篇) 本文罗列出了十多种优化方式,大家可以结合自己的项目,选择适当的方式进行优化.这些 Webpack 插件的源码我大多也没有看过,主要是结合 Webpack 官方 ...

  6. 一文读懂数据库最新技术趋势:TDSQL带你深度纵览VLDB 2019

    一年一度的数据库领域顶级会议 VLDB 2019 于当地时间8月26日-8月30日在美国加利福尼亚州洛杉矶召开.来自学术界和工业界的参会者们汇聚一堂,共襄盛会,探讨交流数据库领域最前沿的技术和发展方向 ...

  7. 老夫带你深度剖析Redisson实现分布式锁的原理

    Redis实现分布式锁的原理 前面讲了Redis在实际业务场景中的应用,那么下面再来了解一下Redisson功能性场景的应用,也就是大家经常使用的分布式锁的实现场景. 引入redisson依赖 < ...

  8. 技术沙龙 | TeaTalk 带你深度探索 SDN 网络技术再创新

    越来越多的企业.行业和政府机关顺应企业数字化转型.云服务和国家政策等趋势将业务迁移上云.随着移动云的快速发展,对网络提供差异化的服务能力也提出了很多新的考验.大规模数据中心.虚拟化 SDN 网络技术及 ...

  9. 带你深度解析Maven

    一.What`s Maven? Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具,简单的说 ...

最新文章

  1. viewport使用 html5
  2. js中 字符串与Unicode 字符值序列的相互转换
  3. Centos 6.4下 MySQL配置主从服务(集群)
  4. udp如何知道对方关闭_聊聊tcp和udp那些事
  5. import openfire4.0.2 source code in eclipse
  6. Java SE 7 Update 25 –发行说明进行了解释。
  7. Java进阶 | IO流核心模块与基本原理
  8. 08.Prevent exceptions from leaving destructors
  9. Python 脚本查询 ip纯真数据库
  10. 中了磁碟机病毒,惨啊!!!
  11. Intel处理器概述
  12. [ITIL学习笔记]ITIL认证相关
  13. android 4.4 设置谷歌拼音输入法为默认输入法,android4.4修改出厂默认输入法
  14. 真香,50行Java代码爬取妹子套图!
  15. 数学公式编辑器:MathType 7 for mac
  16. 新零售时代,门店收银系统选择windows还是安卓?
  17. 无线充电线圈发射端和接收端的区别
  18. 谈谈java中的==和equals
  19. 咖说 | 匿名的「N号房」:数字货币是否应当拥抱监管?
  20. 吹牛的资本之Hibernate框架,五分钟搞定Hibernate...

热门文章

  1. python名词解释总结
  2. 文献集锦 | 非因空间多组学技术在胰腺癌肿瘤微环境中的研究策略
  3. 一起初步学习交换机的基本操作
  4. 过滤器实现自动登录(过滤器filter)
  5. dw怎样搭建php运行环境,dreamweaver中php开发环境配置(基于wamp管理器)
  6. 手把手教你撸touchgfx的数字键盘(一)
  7. ctf-ichunqiu-misc
  8. 实验三、基于A*搜索算法迷宫游戏开发
  9. 多级反馈队列调度算法(转)
  10. 基于ZigBee设计的物联网LED控制系统