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. 在 Windows Server 2008 R2 上安装 IIS 7.5

    原文 在 Windows Server 2008 R2 上安装 IIS 7.5 默认情况下,Windows Server(R) 2008 R2 上不安装 IIS 7.5.可以使用服务器管理器中的“添加 ...

  2. log4j与commons-logging,slf4j的关系(转)

    前面有一篇日志中简单的介绍了 log4j,同时也介绍了它与commons-logging的关系,但是突然冒出来一个slf4j,并且slf4j有取代commons-logging的趋势,所以,我们可以推 ...

  3. WordPress添加评论回复的电子邮件警报通知

    评论回复帖子,主动发送电子邮件通知评论员,这是提高的一大举措的用户体验.倡导孟一直在使用Willin Kan主评论回复电子邮件警报通知码,我相信很多人也使用,假设你没有使用.最好的尝试. 根据自己的需 ...

  4. NYoj 685 查找字符串

    描述 小明得到了一张写有奇怪字符串的纸,他想知道一些字符串出现了多少次,但这些字符串太多了,他想找你帮忙,你能帮他吗?输入字符包括所有小写字母.‘@’.‘+’.   输入 第一行包含一个整数T(T&l ...

  5. java_面试_20140402(爬虫面试题)

  6. S2SH新手框架建立具体过程

    S2SH集成框架新手学习总结 第一章:S2SH框架新手搭建准备工作仅仅都须要导入那些文件 第二篇:S2SH框架新手搭建具体过程 版本号信息:Struts2.3+Hibernate4.3.6+Sprin ...

  7. Entity Framework加载相关实体——延迟加载Lazy Loading、贪婪加载Eager Loading、显示加载Explicit Loading

    Entity Framework提供了三种加载相关实体的方法:Lazy Loading,Eager Loading和Explicit Loading.首先我们先来看一下MSDN对三种加载实体方法的定义 ...

  8. Angularjs -- 核心概念

     angularjs旨在减轻使用AJAX开发应用程序的复杂度,使得程序的创建.測试.扩展和维护变得easy.以下是angularjs中的一些核心概念. 1. client模板      多页面的应用通 ...

  9. json 解析解乱码

    1. 该法的字符编码: 串店txt文档文档都有自己的编码,例如utf-8,ansi等待,但当 存款txt文件.其编码将和txt编码文件本身一致.  例如,之前的字符编码ansi.txt该文件的编码是u ...

  10. poj 2828 线段树

    http://poj.org/problem?id=2828 学到的思维: 1.变化的或者后来的优先影响前面的,那么从最后一个往前看,最后一个就成了 确定的, 而且后来的也能够确定----假设从前往后 ...