Android Toolbar
来源:互联网 发布:怎么封游戏端口 编辑:程序博客网 时间:2024/05/22 14:35
android toolbar
简单的说,就是替代了 actionbar 的另外一个产物。
AppCompatActivity
是替代了 actionbarActivity的另外一个产物。
一,替换 actionbar
1.布局文件
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?actionBarSize" android:background="?attr/colorPrimary"// 设置菜单弹出框的样式 // app:popupTheme="@style/ThemeOverlay.AppCompat.Light"// 设置toolbar的样式// app:theme="@style/ToolBarStyle"> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:ellipsize="end" android:layout_gravity="center" android:gravity="center" android:textColor="@color/white" android:textSize="18dp"/> </android.support.v7.widget.Toolbar>
(1)android:minHeight=”?attr/actionBarSize”:设置标题栏最小高度为ActionBar的高度。
(2)android:background=”?attr/colorPrimary”:该主题下的主色。也就是默认的灰色。
android:theme
Android 5.0 可以给一个 View 单独设置一个 theme 了,其主要用途就是用在 ToolBar 上, 比如 当前使用白色主题但是想使用黑色的 ToolBar ,只要在 ToolBar 的 xml 文件 中添加 android:theme=”@android:style/ThemeOverlay.Material.Dark.ActionBar”
<Toolbar android:layout_height="?android:attr/actionBarSize" android:layout_width="match_parent" android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar" />
该功能在 5.0 之前也存在,只是无法单独在 View 上设置而已,比如 5.0之前的 Theme.Holo.Light.DarkActionBar 主题,就是白色主题但是 ActionBar 是黑色。这种底层实现方式是通过一个 actionBarWidgetTheme 来引入一个新的主题
<style name="Theme.Holo.Light.DarkActionBar"> <item name="android:actionBarWidgetTheme">@android:style/Theme.Holo</item></style>
android:theme 是 5.0 中新添加到 View 上的属性。需要注意的是, 该属性会传递给所有子控件,例如:
<LinearLayout android:theme="@android:style/ThemeOverlay.Material.Dark"> <!--这里面的所有 view 都会使用 ThemeOverlay.Material.Dark theme,除非你在单独给某个 view 设置一个新的 theme 属性 --></LinearLayout>
android:theme这个属性,在android3.0以上可以应用到View及其子View的,但是在android3.0以下只能应用到当前的View,是不能使子View起作用的,所有要用到该theme的View都要加上
图片来源网络,阐述了各自属性的位置
2. 主题文件
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> // 隐藏actionbar <item name="windowActionBar">false</item> // 设置title <item name="windowNoTitle">true</item> //针对actionbar 设置的颜色, toolbar的颜色就设置自己的background <item name="colorPrimary">@color/colorPrimary</item> //状态栏颜色的设置 <item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item> // action 的text的设置<item name="android:textColorPrimary">@android:color/white</item><!--返回或更多(app:showAsAction="never")的按钮颜色--><item name="colorControlNormal">@android:color/white</item><!--菜单字体颜色--><item name="actionMenuTextColor">@android:color/white</item>//背景的设置<item name="android:windowBackground">@color/back</item> // 设置弹出菜单的位置 参照:http://blog.csdn.net/liyuanjinglyj/article/details/50402436 <item name="actionOverflowMenuStyle">@style/LYJMenuStyle</item> <style name="LYJMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow"> <item name="overlapAnchor">false</item> <!-- :弹出菜单背景色为标题栏的背景色 --> <item name="android:popupBackground">?attr/colorPrimary</item> <item name="android:dropDownVerticalOffset">20dip</item> </style></style>//toolbar的样式设置 <style name="ToolBarTitle" > <item name="android:textSize">17dp</item> <item name="android:textColor">@color/white</item> </style> <style name="ToolBarMenuText"> <item name="android:textSize">16dp</item> <item name="android:textColor">@color/white</item> </style> <style name="ToolBarStyle" parent="Widget.AppCompat.Toolbar"> <item name="actionMenuTextAppearance">@style/ToolBarMenuText</item> <item name="titleTextAppearance">@style/ToolBarTitle</item> </style>
可以在 v21中设置导航栏背景
<style name="AppTheme" parent="AppTheme.Base"> <item name="android:navigationBarColor">#66cc99</item> </style>
3.menu_main.xml
always:总是显示在界面上
never:不显示在界面上,只让出现在右边的三个点中
ifRoom:如果有位置才显示,不然就出现在右边的三个点中
withText: 可以在导航栏中设置标题,这个标题就是通过 android:title 定义的
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".activity.MainActivity"> <item android:id="@+id/weather" //优先级,表明摆放的顺序,不一定从0还是计算,但必须大于等于0,建议从0,1,2,3....这样依次给出 android:orderInCategory="100" android:title="" //设置右上角显示的图标 android:icon="@mipmap/weather" app:showAsAction="ifRoom|withText" android:textSize="16dp" android:textColor="@color/white"/></menu>
代码中
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (ViewUtils.isFastClick()) return true; switch (item.getItemId()) { //左上角的 默认 home id按钮 case android.R.id.home: break; //其他 menu 中的 id按钮事件 case R.id.xx: break; default: break; } return super.onOptionsItemSelected(item); }
PS:实际中,还是点击按钮 弹出自定义的pop 更方便,并且更加适合改动,actionbar 弹出的这个window能设置的属性比较有限,效果也很一般。
5. 代码中设置 toolbar
@Bind(R.id.toolbar) Toolbar mToolBar;//setHomeButtonEnabled这个小于4.0版本的默认值为true的。但是在4.0及其以上是false,该方法的作用:决定左上角的图标是否可以点击。没有向左的小图标。 true 图标可以点击 false 不可以点击。// 给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP//actionBar.setDisplayHomeAsUpEnabled(true)//使左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标,对应id为android.R.id.home,// 对应ActionBar.DISPLAY_SHOW_HOME// actionBar.setDisplayShowHomeEnabled(true)// 使自定义的普通View能在title栏显示,即actionBar.setCustomView能起作用,对应ActionBar.DISPLAY_SHOW_CUSTOM//actionBar.setDisplayShowCustomEnabled(true)//对应ActionBar.DISPLAY_SHOW_TITLE。//actionBar.setDisplayShowTitleEnabled(true)//其中setHomeButtonEnabled和setDisplayShowHomeEnabled共同起作用,如果setHomeButtonEnabled设成false,//即使setDisplayShowHomeEnabled设成true,图标也不能点击 private void initToolBar(boolean hideBackButton) { if (mToolBar == null) { return; } // 设置 titlebar 替代 actionbar setSupportActionBar(mToolBar); // 获取设置后的对象 android.support.v7.app.ActionBar ab= getSupportActionBar(); if (ab!= null) { // 设置左上角的自定义图标 ab.setHomeAsUpIndicator(R.mipmap.menu); // 设置显示 ab.setDisplayHomeAsUpEnabled(true); }}
问题:
在布局XML中设置Android:navigationIcon=”@drawable/icon”或者在代码中设置都无法自定义成自己需要设置的NavigationIcon图片。
解决办法:
放弃在xml中设置,并且必须在ToolBar初始化之后,setSupportActionBar(toolbar)方法之后,setNavigationIcon()以及各种自定义ToolBar设置(例如:toolbar.setTitle(“Title”);)之前,否者同样无法将设置应用到ToolBar之上。
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);toolbar.setNavigationIcon(R.drawable.icon);toolbar.setTitle("My Title");toolbar.setSubtitle("Sub title");toolbar.setLogo(R.drawable.ic_launcher);
这个图来自于网络,很直观,toolbar的各属性
二,单独使用 toolbar
xml 还用之前的就好了。
1. 类中的代码
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); android.support.v7.app.ActionBar ab= getSupportActionBar(); if (actionBar != null) { ab.setDisplayHomeAsUpEnabled(true); //隐藏actionbar的 title ab.setDisplayShowTitleEnabled(false); }// Logotoolbar.setLogo(R.drawable.ic_launcher);// 一级标题toolbar.setTitle("My Title");// 二级标题toolbar.setSubtitle("Sub title");// 单独设置 toolbar的menu菜单toolbar.inflateMenu(R.menu.activity_main);// Navigation Icon 要設定在 setSupoortActionBar后 才有作用// 否則會出現 back button toolbar.setNavigationIcon(R.drawable.ab_android);//设置点击事件toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } });// Menu item click 设定在 setSupportActionBar 之后才有作用toolbar.setOnMenuItemClickListener(onMenuItemClick);//脱离actionbar 的 toolbar 自定义点击事件处理private Toolbar.OnMenuItemClickListener onMenuItemClick = new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.xxx: break; } return true; }};
- Android Toolbar
- android ToolBar
- android toolbar
- Android Toolbar
- Android ToolBar
- Android Toolbar
- android toolbar
- Android ToolBar
- Android Toolbar
- ANDROID Toolbar
- Android Toolbar
- 【ToolBar】Android ToolBar之完全解析
- android 控件 隐藏toolbar-(CoordinatorLayout Toolbar AppbarLayout)
- android 控件 toolbar BaseActivity集成toolbar
- android:ToolBar详解
- android:ToolBar详解
- android:ToolBar详解
- Android toolBar详解
- UFT原理
- 〓OpenCV〓 开发环境搭建
- 关于绝对路径和相对路径
- python list的一些用法总结
- Hadoop学习笔记(八)MapReduce深入分析
- Android Toolbar
- 父jsp弹出另一个jsp时用form提交并刷新父jsp
- POJ 2112 Optimal Milking 最大流 + 二分 + floyd
- 接触UI
- UE4 COLLISION FILTERING
- Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost解决方法
- Java collection框架介绍和使用
- C++11简介
- 关于android 中同时在activity中启动Service