Android支持包22.1引进了AppCompatDelegate

最新22.1版本的支持包引入了大量酷炫的新特性,这些特性将允许我们轻易地将材料设计/API 21+的特性应用到之前的那些老的,不兼容的Activity上面。

我们知道,继承AppCompatActivity是最容易实现的方式,但是有时候我们还是需要使用老办法,对吗?

你可以使用支持包提供了新的AppCompatDelegate构件,很容易地将Toolbar添加到Activity上。

1,将Toolbar控件添加到布局文件上面

ActionBar现在已经被不再被告维护了,它应该被Toolbar取代,因为后者允许了更多的UI灵活性,并且允许Activity更容易地兼容于材料设计的UI模式。

因为我们要在这使用支持包,那么我们将使用Toolbar的支持版本,不然的话,将只能在API  21+上可用。

在xml中添加如下内容:

 <android.support.v7.widget.Toolbar
android:id="@+id/my_awesome_toolbar"
android:layout_height="@dimen/abc_action_bar_
default_height_material"
android:layout_width="match_parent"
android:minHeight="@dimen/abc_action_bar_
default_height_material"
android:background="?attr/colorPrimary"
/>

2,修改主题:

因为我们要将Toolbar嵌入到布局文件中,所以我们需要不支持ActionBar的主题。

所以,在确定在styles.xml文件中使用主题Theme.AppCompat.NoActionBar。

特别推荐,要在你的主题上添加如下所示的材料设计色彩项,这将很容易地实现对Toolbar和状态栏的着色(只有API 21+的设备上才会对状态栏进行着色):

 <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- colorPrimary is used for coloring the Toolbar -->
<item name="colorPrimary">#3F51B5</item>
<!-- colorPrimaryDark is used for coloring the status bar -->
<item name="colorPrimaryDark">#303F9F</item>
<!-- colorAccent is used as the default value for colorControlActivated
which is used to tint widgets -->
<item name="colorAccent">#FFAB40</item>
</style>

3,将AppCompatDelegate添加到Activity里面

AppCompatDelegate是一个委托代表,它将AppCompatActivity的特性提供给Activity,而且只能通过create()方法创建,此时它需要两个参数,Activity和AppCompatCallback。

所以,首先,我们将Activity实现AppCompatCallback接口,在本例中,可以不必具体实现要覆盖的方法。

 public class MainActivity extends Activity implements AppCompatCallback {
@Override
public void onSupportActionModeStarted(ActionMode mode) {
//let's leave this empty, for now
}
@Override
public void onSupportActionModeFinished(ActionMode mode) {
// let's leave this empty, for now
}
}

然后,在Activity的onCreate()方法中,

  1. 通过AppCompatDelegate.create()方法创建AppCompatDelegate;
  2. 调用AppCompatDelegate.create();(有些Activity的生命周期方法应用由该AppCompatDelegate代理)
  3. 通过AppCompatDelegate.setContentView()方法填充布局文件;
  4. 通过AppCompatDelegate.setSupportActionbar()将Toolbar添加给AppCompatDelegate。
 private AppCompatDelegate delegate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//let's create the delegate, passing the activity at both arguments (Activity, AppCompatCallback)
delegate = AppCompatDelegate.create(this, this);
//we need to call the onCreate() of the AppCompatDelegate
delegate.onCreate(savedInstanceState);
//we use the delegate to inflate the layout
delegate.setContentView(R.layout.activity_main);
//Finally, let's add the Toolbar
Toolbar toolbar= (Toolbar) findViewById(R.id.my_awesome_toolbar);
delegate.setSupportActionBar(toolbar);
}

特别推荐,一个Activity只能链接到一个AppCompatDelegate实例,因此通过create()方法返回的实例应该保存在Activity里面直到该Activity被销毁。

现在,你已经完成了,运行你的应用,然后你的Activity将会魔法一般拥有一个Toolbar,而且看起来完全你是材料设计的AppCompatActivity!

非常简单?

再次声明,这只是边缘事例,在使用AppCompatDelegate之前,问题要考虑使用AppCompatActivity。

同时,一定要检出AppCompatDelegate的完全引用。如果你想要AppCompatDelegate活动地完全像一个AppCompatActivity,那么在你包裹AppCompatDelegate到Activity时将有大量的方法需要考虑写。

如何给非AppCompatActivity添加Toolbar?--关于5.0新特性兼容5.0以下设备的探索的更多相关文章

  1. C# 9.0 新特性之参数非空检查简化

    阅读本文大概需要 1.5 分钟. 参数非空检查是缩写类库很常见的操作,在一个方法中要求参数不能为空,否则抛出相应的异常.比如: public static string HashPassword(st ...

  2. EF6.0新特性-DbCommandInterceptor实现非SQL端读写分离

    前几天看了一个基于sqlserver的负载均衡与读写分离的软件Moebius,实现的方式还是不错的,这使得用sqlserver数据库的同学时有机会对数据库进行更有效的优化了

  3. AppCompatActivity与toolbar的结合

    原文:http://www.51itong.net/android-activity-appcompatactivity-toolbar-15750.html 另外一个博客:Android 5.x T ...

  4. Sql Server 2012新特性 Online添加非空栏位.

    我们都知道,Sql Server在一个数据量巨大的表中添加一个非空栏位是比较费心的,缺乏经验的DBA或是开发人员甚至可能鲁莽地直接添加导致阻塞相应业务,甚至可能因为资源欠缺造成实例的全局问题.当然这都 ...

  5. 如何静态添加toolbar到datagrid

    这个示例向你展示如何添加toolbar到datagrid. 创建 DataGrid <table id="tt" class="easyui-datagrid&qu ...

  6. Android5.x新特性之 Toolbar和Theme的使用

    Toolbar 你还在为Android 的ActionBar的文字不能随意设置位置而烦恼么?你还在为ActionBar不能自定义添加自己的布局而烦恼么?现在告诉你一个好消息,当你看到这篇文章时,就不必 ...

  7. iOS- 给App添加内购& 验证购买iOS7新特性

    1.内购——应用内购买 我所说的内购——也可以说是应用内购买 大家都知道通过苹果应用程序商店有三种主要赚钱的方式: 1.直接收费(与国内大部分用户的消费习惯相悖,如果要收费,直接收高的,别收6块钱) ...

  8. 【译】Meteor 新手教程:在排行榜上添加新特性

    原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...

  9. Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理

    RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...

随机推荐

  1. 60分钟Python快速学习(转)

    60分钟Python快速学习(给发哥一个交代) 阅读目录 第一步:开发环境搭建: 第一个Python功能:初识Python 02.Python中定义变量不需要数据类型 03.在Pythod中定义方法 ...

  2. 客房收费系统改造(三)—厂+反射+DAL

    前一段时间有一个简单的三登录功能实现窗口,心灵修养一点点,但很快就被泼了一盆冷水.房费是不可能做到在短短三年,假设你使用三个,这倒房费三个功能必须使用函数来实现.了七层的研究. 经过一个星期的看博客. ...

  3. 皴linux rootpassword(方式:重置rootpassword)

    皴linux rootpassword: 开机后,.点击"e"进入维护模式.选"内核选项",例如,看到下面的数字: watermark/2/text/aHR0c ...

  4. iptables的CLUSTER target以太网交换机和想法

    周末热风,这个想法从未在我的心脏像样的雨一阵悲哀. 每到周末,我会抽出一周整夜的事情的总结,无论是工作.人生,或者在上班或在锯的方式方法,并听取了抑制书评,因为无雨,周六晚上,我决定好好睡一觉,再折腾 ...

  5. 快速解读GC日志(转)

    本文是 Plumbr 发行的 Java垃圾收集手册 的部分内容.文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息.我们通过 -XX:+UseSerialGC 选项,指定JVM ...

  6. web富客户端应用下,前端架构问题。

    前言: 以前的工作大部分都是,前端做页面 稍微写几个js效果就算是 有复杂的效果 也没有涉及到 需要去调用后端数据的层面.总体来说,以前的页面逻辑会相对简单后端会做更多的事. 而现在,这些任务都抛给前 ...

  7. php实现和c#一致的DES加密解密

    原文:php实现和c#一致的DES加密解密 php实现和c#一致的DES加密解密,可以从网上搜到一大堆,但是测试后发现都没法用.以下正确代码是我经过苦苦才找到的.希望大家在系统整合时能用的上. 注意: ...

  8. KMP算法之从next[]到nextVal[] (转)

    前些日子写了一篇KMP算法的博文,浅谈数据结构之KMP(串中的模式匹配算法),在这片文章中,谈到了一个模式串K值的记录数组 next[],详细可看那篇文章,其实,前面定义的next[]数组是有一定缺陷 ...

  9. crawler_基础之_httpclient 访问网络资源

    先粘贴一个 简单版的,后期再修改 pom文件 <dependency> <groupId>org.apache.httpcomponents</groupId> & ...

  10. linux_shell_根据网站来源分桶

    应用场景: 3kw行url+\t+html记录 [网站混合] 需要:按照网站来源分桶输出 执行shell cat */*pack.html|awk -F '\t' '{ split($1,arr,&q ...