原文地址 http://www.cnblogs.com/Dentist/p/4370176.html

Android4.0出现的Actionbar提供了同意方便的导航管理。很大程度的统一了Android应用的风格,但他定制性差,使用不灵活的缺点限制了Android应用的发展。

Android5.0谷歌推出了Material Design。用ToolBar代替了Actionbar。继承了Actionbar的用法。却像布局一样任意修改。

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:orientation="vertical"
  4. android:layout_height="match_parent" >
  5.  
  6. <android.support.v7.widget.Toolbar
  7. android:id="@+id/toolbar"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:background="?attr/colorPrimary">
  11. </android.support.v7.widget.Toolbar>
  12.  
  13. <EditText
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="Hello World"/>
  17.  
  18. <TextView
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="Hello World"/>
  22.  
  23. </LinearLayout>

然后代码里找到并设置为SupportActionBar就成为了一个真正的Actionbar。不过theme里关于ActionBar的属性对他不管用。因为他是假的,是Google的特技。

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  6. setSupportActionBar(toolbar);
  7. }

但 onCreateOptionsMenu  和  onOptionsItemSelected都有用。

设置导航图标 toolbar.setNavigationIcon();

但设置标题则需要用 getSupportActionBar().setTitle();

使用ToolBar时一定要把Activity的Theme设为NoActionBar。或者Theme.AppCompat并重写这俩属性

  1. <item name="windowActionBar">false</item>
  2. <item name="android:windowNoTitle">true</item>

因为Theme.AppCompat.NoActionBar仅仅就是在Theme.AppCompat的基础上多加了上面两行。看源码便知。

然后你一定会发现:

当你使用Light主题时。APP所有字的颜色都是黑色,包括Toolbar的字体颜色也是黑色。

当你使用Dark(普通)主题时。APP所有字的颜色都是白色,包括Toolbar的字体颜色也是白色。就像这样:

而google的Material Design展示的优雅界面

这TM是在逗我。。。

其实ToolBar支持单独设置一个theme

  1. <android.support.v7.widget.Toolbar
  2. android:id="@+id/toolbar"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:background="?attr/colorPrimary"
  6. app:theme="@style/Theme.AppCompat">
  7. </android.support.v7.widget.Toolbar>

然后给Activity设置为Light主题。就完美解决了。

但每个页面都写这样一堆XML代码洁癖患者实在受不了。

可以使用include标签优雅的解决。

  1. <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:app="http://schemas.android.com/apk/res-auto"
  3. android:id="@+id/toolbar"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. app:theme="@style/Theme.AppCompat"
  7. android:background="@color/colorPrimary">
  8.  
  9. </android.support.v7.widget.Toolbar>
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:orientation="vertical"
  4. android:layout_height="match_parent">
  5.  
  6. <include layout="@layout/toolbar" />
  7.  
  8. <EditText
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="Hello World"/>
  12.  
  13. <TextView
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="Hello World"/>
  17.  
  18. </LinearLayout>

注意当你换了Toolbar的主题就不能再用 android:background="?attr/colorPrimary" 这种基于主题的资源,应该直接重新定义。

然后介绍下ToolBar的特技。

1.动画显示/隐藏ToolBar

  1. public void showToolbar(boolean show){
  2. if (show == toolbarShow || toolbar == null)return;
  3. toolbarShow = show;
  4. if (show) {
  5. toolbar.animate()
  6. .translationY(0)
  7. .alpha(1)
  8. .setDuration(HEADER_HIDE_ANIM_DURATION)
  9. .setInterpolator(new DecelerateInterpolator());
  10. } else {
  11. toolbar.animate()
  12. .translationY(-toolbar.getBottom())
  13. .alpha(0)
  14. .setDuration(HEADER_HIDE_ANIM_DURATION)
  15. .setInterpolator(new DecelerateInterpolator());
  16. }
  17. }

2.设置ToolBar的背景透明度

  1. //设置好ToolBar过后
  2. mActionbarDrawable = new ColorDrawable(getResources().getColor(R.color.theme_primary));
  3. getSupportActionBar().setBackgroundDrawable(mActionbarDrawable);

  

  1. protected void setToolbarAlpha(float alpha){
  2. mActionbarDrawable.setAlpha((int) (alpna*255));
  3. }

这两个特技一般都配合RecyclerView SccollView等滑动视图(过时的ListView不考虑了)。

RecyclerView :

  1. public abstract class HidingScrollListener extends RecyclerView.OnScrollListener {
  2.  
  3. @Override
  4. public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
  5. super.onScrolled(recyclerView, dx, dy);
  6. Utils.Log("percent:" + dy);
  7. if (dy > 1){
  8. onHide();
  9. }else if(dy < -1){
  10. onShow();
  11. }
  12. }
  13.  
  14. public abstract void onHide();
  15. public abstract void onShow();
  16.  
  17. }
  1. mRecyclerView.setOnScrollListener(new HidingScrollListener() {
  2. @Override
  3. public void onHide() {
  4. showToolbar(false);
  5. }
  6.  
  7. @Override
  8. public void onShow() {
  9. showToolbar(true);
  10. }
  11. });

SccollView:

  1. public class ObservableScrollView extends ScrollView {
  2. public interface ScrollViewListener {
  3.  
  4. void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
  5.  
  6. }
  7. private ScrollViewListener scrollViewListener = null;
  8.  
  9. public ObservableScrollView(Context context) {
  10. super(context);
  11. }
  12.  
  13. public ObservableScrollView(Context context, AttributeSet attrs,
  14. int defStyle) {
  15. super(context, attrs, defStyle);
  16. }
  17.  
  18. public ObservableScrollView(Context context, AttributeSet attrs) {
  19. super(context, attrs);
  20. }
  21.  
  22. public void setScrollViewListener(ScrollViewListener scrollViewListener) {
  23. this.scrollViewListener = scrollViewListener;
  24. }
  25.  
  26. @Override
  27. protected void onScrollChanged(int x, int y, int oldx, int oldy) {
  28. super.onScrollChanged(x, y, oldx, oldy);
  29. if (scrollViewListener != null) {
  30. scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
  31. }
  32. }
  33.  
  34. }
  1. mScrollView.setScrollViewListener(new ObservableScrollView.ScrollViewListener() {
  2. @Override
  3. public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
  4. if (y-oldy>3){
  5. showToolbar(false);
  6. }else if(y-oldy<-3){
  7. showToolbar(true);
  8. }
  9. }
  10. });

Toolbar使用的更多相关文章

  1. 安卓自定义组合控件--toolbar

    最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...

  2. Android开发之Android Material Design Toolbar自定义随笔

    一.自定义Toolbar的menu: 在menu下新建menu.xml文件,自定义menu的样式: <menu xmlns:android="http://schemas.androi ...

  3. Android Toolbar 开发总结

    初识 Toolbar Toolbar是在 Android 5.0 开始推出的一个 Material Design 风格的导航控件 ,Google 非常推荐大家使用 Toolbar 来作为Android ...

  4. 安卓Design包之AppBar和Toolbar的联用

    前面讲了Design包的的CoordinatorLayout和SnackBar的混用,现在继续理解Design包的AppBar; AppBarLayout跟它的名字一样,把容器类的组件全部作为AppB ...

  5. 分别用ToolBar和自定义导航栏实现沉浸式状态栏

    一.ToolBar 1.在build.gradle中添加依赖,例如: compile 'com.android.support:appcompat-v7:23.4.0' 2.去掉应用的ActionBa ...

  6. 【Windows编程】系列第六篇:创建Toolbar与Statusbar

    上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...

  7. Ext动态加载Toolbar

    在使用Ext的GridPanel时候,有时候需要面板不用重新加载而去更新Store或者Toolbar,Store的方法有很多,例如官方api给我们提供的Store.load(),Store.reLoa ...

  8. 浅谈ListView滑动隐藏显示ToolBar

    引言 在App日益追求体验的时代,优秀的用户体验往往会使产品脱颖而出.今天我们就来介绍一种简单的滑动ListView来显示或者隐藏ToolBar的功能. 布局文件 下面我们来看一下这个主界面的布局文件 ...

  9. Android 自定义ToolBar详细使用

    自定义xml设置ToolBar,通过menu文件扩展选项,通过继承baseactivity使用 1.ToolBar布局 <?xml version="1.0" encodin ...

  10. ExtJS扩展:扩展grid之toolbar button禁用表达式

          在前一篇文章我们扩展了grid通过选中记录数来禁用toolbar上的按钮,有时候我们需要通过记录中的数据来决定是否禁用按钮,今天我们就来扩展它.       照例,最新的代码和例子都在gi ...

随机推荐

  1. Python 面向对象的三大特性:封装,继承,多态

    # 面向对象的三大特性:封装,继承,多态 # 继承的影响:资源的继承,资源的使用,资源的覆盖,资源的累加 # 资源的继承,在Python中的继承是指能使用父类的资源,而不是说在子类也复制一份父类代码到 ...

  2. 并发-ConcurrentHashMap源码分析

    ConcurrentHashMap 参考: http://www.cnblogs.com/chengxiao/p/6842045.html https://my.oschina.net/hosee/b ...

  3. XP_SP3_专业汉化版__x86_cd_x14-80404

    1.镜像文件: zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso 来自 msdn itellyou 2. ...

  4. 测绘类SCI

    GeoInformatica(国际地理信息系统计算机科学进展杂志)美国International Journal of Geographical Information Science(国际地理信息科 ...

  5. D3.js学习笔记(四)—— 使用SVG坐标空间

    目标 在这一章,你将要使用D3.js基于一些数据把SVG元素添加到你想要的坐标位置上. 我们的目标就是使用下面的数据集: var spaceCircles = [30,70,110]; 并使用D3.j ...

  6. R语言和中国地图

    上图是R语言绘制的按地域分布的数据图.更科学,更严谨,也更有质感的样子. 今天瞎写点东西,我在想数据分析的意义是什么,也许就是研究事物存在的形式.而事物存在的形式是什么样子呢,从最初的三维空间,爱因斯 ...

  7. 分享知识-快乐自己:能使 Oracle 索引失效的六大限制条件

    Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时候却适得其反. 例如一张表中有上百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这可能是 oracle 索引失效造成的.or ...

  8. 移动国家号(MCC)

    定义移动国家号 Mobile Country Code (MCC)由三位十进制数组成,它表明移动用户(或系统)归属的国家. 格式移动国家号(MCC)由三个十进制数组成,编码范围为十进制的000-999 ...

  9. 【scala】应用程序和App特性

    一.应用程序 要运行一个Scala对象,必须提供一个独立对象的名称.这个独立对象需要包含一个main方法,该方法接受一个Array[String]作为参数,结果类型为Unit. import Chec ...

  10. nivicat premium连接阿里云数据库

    1.首先打开Navicat,文件>新建连接>MySQL连接,其他的如一图所示 其中: 连接名:自己取一个名字 主机名:填写mysql的地址 用户名:mysql的登录的用户名 密码:登录的密 ...