参考:

  https://developer.android.com/training/appbar/index.html

1,自定义toolbar主题

2,在布局xml中使用toolbar

3,在代码中启用toolbar

4,添加菜单

5,处理菜单事件

6,向上导航事件

7,定义actionView

8,actionView的菜单展开/收起 事件

9,定义actionProvider

1,AppCompatActivity与常见的activity不同,要用 Theme.AppCompat.xxx系列中的一个不带actionbar的主题 。并可以自定义它。

 <resources>

     <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!--设置每个菜单项及它选中时的背景色-->
<item name="android:itemBackground">#a4f5f6</item>
<!--<item name="android:background">#303F9F</item>--> <!--下面3行是ToolBar的状态栏沉浸效果-->
<!--<item name="android:windowTranslucentStatus">false</item>-->
<!--<item name="android:windowTranslucentNavigation">true</item>-->
<!--<item name="android:statusBarColor">#0176da</item>--> <!-- Toolbar风格 -->
<item name="toolbarStyle">@style/Theme.Toolbar.App.Style</item> <!--溢出菜单中的action间的分割线-->
<item name="android:dividerHeight">1dp</item>
<!--文本大小-->
<item name="android:textSize">20sp</item>
<!--文本颜色-->
<item name="android:textColorPrimary">#ffffff</item>
<!--设置菜单不遮挡actionbar-->
<item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
<!--配置Menu的图标-->
<item name="actionOverflowButtonStyle">@style/ToolBar.ActionButton.Overflow</item>
</style> <!--溢出菜单样式 -->
<style name="OverflowMenuStyle" parent="Widget.AppCompat.Light.PopupMenu.Overflow">
<!--溢出菜单的宽度-->
<item name="android:dropDownWidth">wrap_content</item>
<item name="android:paddingRight">5dp</item> <!--溢出菜单窗口的背景,它与菜单项的背景不同,如果所有菜单项加一起盖住了窗口,那么这个背景色看不到-->
<item name="android:popupBackground">#89a81d</item> <!--溢出菜单不遮挡ToolBar-->
<item name="overlapAnchor">false</item> <!--溢出菜单垂直偏移,水平偏移-->
<item name="android:dropDownVerticalOffset">5dip</item>
<item name="android:dropDownHorizontalOffset">0dip</item>
</style> <!--溢出按钮样式 -->
<style name="ToolBar.ActionButton.Overflow" parent="android:style/Widget.Holo.Light.ActionButton.Overflow">
<item name="android:src">@android:drawable/ic_menu_add</item>
</style> <!--=============下面是toolbar相关主题============-->
<!-- Toolbar样式 -->
<style name="Theme.Toolbar.App.Style" parent="@style/Widget.AppCompat.Toolbar">
<item name="android:background">#33B5E5</item>
<!--注意不要用android:titleTextAppearance,要用xmlns:app="http://schemas.android.com/apk/res-auto"下的,
不带前缀就是app:下的-->
<!--主标题-->
<item name="title">title</item>
<!--副标题-->
<item name="subtitle">subtitle</item> <!--logo-->
<item name="logo">@android:drawable/ic_menu_call</item>
<!--主标题样式-->
<item name="titleTextAppearance">@style/Theme.ToolBar.App.Title</item>
<!--副标题样式-->
<item name="subtitleTextAppearance">@style/Theme.ToolBar.App.Subtitle</item> <item name="android:minHeight">?attr/actionBarSize</item>
<item name="titleMargins">4dp</item>
<!--ToolBar的Home图标左侧间隙-->
<item name="contentInsetStart">16dp</item> <!--当home图标折叠时显示的图标-->
<item name="collapseIcon">@android:drawable/ic_menu_compass</item>
<item name="collapseContentDescription">collapseContentDescription</item>
<item name="android:paddingLeft">10dp</item>
<item name="android:paddingRight">10dp</item> </style> <!--设置toolbar标题主题-->
<style name="Theme.ToolBar.App.Title" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#ffffff</item>
</style> <!--toolbar副标题主题-->
<style name="Theme.ToolBar.App.Subtitle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Subtitle">
<item name="android:textSize">9sp</item>
<item name="android:textColor">#ff0000</item>
</style>
</resources>

2,在layout.xml中添加toolbar

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.txw.e.toolbardemo.MainActivity"> <android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/> <!--app:contentInsetStart="3dp"-->
<!--app:title="Title"-->
<!--app:subtitle="subtitle"-->
<!--app:logo="@android:drawable/ic_menu_directions"-->
<!--app:titleTextAppearance="@style/Theme.ToolBar.Base.Title"-->
<!--app:subtitleTextAppearance="@style/Theme.ToolBar.Base.Subtitle"--> <!--app:title等属性也可以定义在style.xml中,注意是app命名空间下的,不是android:title,后者不显示。
xmlns:app="http://schemas.android.com/apk/res-auto"
--> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"
android:text="Hello toolbar!" /> </RelativeLayout>

3,在layout对应的activity或fragment的onCreate中:

下面是activity示例

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
}

下面是fragment示例

 public class MainView extends Fragment {

     public Toolbar                 actionBar;
public void initActionBar(View rootView){
//用toolbar实现 actionbar
actionBar = (Toolbar) rootView.findViewById(R.id.toolbar);
Drawable overflow = actionBar.getResources().getDrawable(R.drawable.ab_overflow_btn); actionBar.setTitleTextColor(Color.WHITE);
actionBar.setOverflowIcon(overflow); AppCompatActivity aca = (AppCompatActivity) getActivity();
aca.setSupportActionBar(actionBar); }
//...
}

4,添加action item,注意其中的  app:showAsAction 不是android:showAsAction 其它与actionbar类似。

 <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="com.e.weixin.MainActivity"> <item
android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always|collapseActionView"/> <item android:id="@+id/action_share"
android:icon="@android:drawable/ic_menu_share"
android:title="share"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
<item
android:id="@+id/action_expand"
android:icon="@android:drawable/ic_menu_add"
android:title="展开/收起"
app:showAsAction="never|collapseActionView"/>
<item
android:id="@+id/action_home_as_up"
android:icon="@android:drawable/ic_menu_upload"
android:title="向上导航"
app:showAsAction="never"/>
<item
android:id="@+id/action_scan"
android:icon="@android:drawable/ic_menu_send"
android:title="scan"
app:showAsAction="never"/>
<item
android:id="@+id/action_get_money"
android:icon="@android:drawable/ic_menu_crop"
android:title="sq"
app:showAsAction="never"/>
<item
android:id="@+id/action_help_and_feedback"
android:icon="@android:drawable/ic_menu_help"
android:title="help"
app:showAsAction="never"/> </menu> 

5,处理事件与actionbar相似。

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
// User chose the "Settings" item, show the app settings UI...
return true; case R.id.action_favorite:
// User chose the "Favorite" action, mark the current item
// as a favorite...
return true; default:
// If we got here, the user's action was not recognized.
// Invoke the superclass to handle it.
return super.onOptionsItemSelected(item); }

6,处理向上导航事件,先设置activity上下级,然后得到ActionBar,然后用它处理向上导航事件。

 <application ... >
... <!-- The main/home activity (it has no parent activity) --> <activity
android:name="com.example.myfirstapp.MainActivity" ...>
...
</activity> <!-- A child of the main activity -->
<activity
android:name="com.example.myfirstapp.MyChildActivity"
android:label="@string/title_activity_child"
android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
</application>

处理代码

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_child); // my_child_toolbar is defined in the layout file
Toolbar myChildToolbar =
(Toolbar) findViewById(R.id.my_child_toolbar);
setSupportActionBar(myChildToolbar); // Get a support ActionBar corresponding to this toolbar
ActionBar ab = getSupportActionBar(); // Enable the Up button
ab.setDisplayHomeAsUpEnabled(true);
}

7,自定义 action view

在menu.xml对应有action项中

 <item
android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always|collapseActionView"/>

在代码中

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_activity_actions, menu); MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView =
(SearchView) MenuItemCompat.getActionView(searchItem); // Configure the search info and add any event listeners... return super.onCreateOptionsMenu(menu);
}

8,响应action view 展开/收起 事件。要指定collapseActionView和app:actionViewClass。

 <item
android:id="@+id/action_expand"
android:icon="@android:drawable/ic_menu_add"
android:title="展开/收起"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always|collapseActionView"/>

  指定了 collapseActionView 属性后,才可响应actionView的展开/收起事件。在按对应的item之前(action view展开之前),一直显示在android:icon="xxx" 中指定的图标。

  如果在activity中重写了onOptionsItemSelected() ,注意要调用 super.onOptionsItemSelected() 才能展开action view事件。

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
// ... // Define the listener
OnActionExpandListener expandListener = new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when action item collapses
return true; // Return true to collapse action view
} @Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true; // Return true to expand action view
}
}; // Get the MenuItem for the action item
MenuItem actionMenuItem = menu.findItem(R.id.myActionItem); // Assign the listener to that action item
MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener); // Any other things you have to do when creating the options menu… return true;
}

9,添加及自定义action provider

 <item android:id="@+id/action_share"
android:icon="@android:drawable/ic_menu_share"
android:title="share"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

  For information about creating a custom action provider, see the ActionProvider reference. For information about configuring a ShareActionProvider, see the reference for that class.

ToolBar教程:AppCompatActivity下用toolbar当actionbar用的更多相关文章

  1. 自定义toolbar教程

    1.写toolbar的布局文件 ,toolbar.xml <?xml version="1.0" encoding="utf-8"?> <Re ...

  2. winsock教程- windows下的socket编程(c语言实现)

    winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程     这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...

  3. 【秒懂】号称最为简明实用的Django上手教程(下)

    号称最为简明实用的Django上手教程(下) 作者:白宁超 2017年8月25日08:51:58 摘要:上文号称[最为简明实用的Django上手教程]介绍了django基本概念.配置和相关操作.相信通 ...

  4. 使用Keil语言的嵌入式C编程教程(下)

    使用Keil语言的嵌入式C编程教程(下) 用8051单片机进行定时器/计数器的计算与编程 延迟是应用软件开发中的重要因素之一.然而,在实现定时延迟的过程中,正常的延迟并不能给出克服这一问题的宝贵结果. ...

  5. DevExpress中barManager下的toolbar如何在panel中显示

    如题,我的Dev Toolbar需要在一个pannel中显示,并且居于最顶部.可是好像默认情况下toolbar都是在窗体的最顶部的,如何设置才能使其位于一个panel的最顶部呢? 解决方案:经过测试, ...

  6. [个人翻译]Redis 集群教程(下)

    [个人翻译]Redis 集群教程(上) [个人翻译]Redis 集群教程(中) 官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过 ...

  7. 微信小程序教学第三章第四节(含视频):小程序中级实战教程:下拉更新、分享、阅读标识

    下拉更新.分享.阅读标识 本文配套视频地址: https://v.qq.com/x/page/h0554i4u5ob.html 开始前请把 ch3-4 分支中的 code/ 目录导入微信开发工具 这一 ...

  8. 低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar

           一.自定义MenuItem的视图 custom_view.xml (就是一个单选按钮) <?xml version="1.0" encoding="u ...

  9. Unity入门教程(下)

    一.概要 在 Unity入门教程(上) 中我们创建了一个游戏项目,并且创建了玩家角色和小球这些游戏对象,还通过添加游戏脚本实现了小方块的弹跳.虽然功能比较简单,但是完整地表现了使用Unity开发游戏的 ...

随机推荐

  1. htmlspecialschars与htmlentities的区别

    根据php手册,htmlentities与htmlspecialchars功能几乎是一模一样.唯一的差别就是,对于无效的代码单元序列(通俗讲就是不认识的编码)是否进行编码.htmlentities会进 ...

  2. gulp基本语法

    pipe:用管道输送 1.gulp.src(glops[, options]) 输出(Emits)符合所提供的匹配模式(glob)或者匹配模式的数组(array of globs)的文件. 将返回一个 ...

  3. Remove Duplicates from Sorted List (链表)

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  4. Ubuntu 16.04出现chmod: 无效模式:"a"的问题解决

    命令: chmod a+x file1 提示:注意文件的类型,如果用在文件夹上是不行的,但是文件确实可以的.

  5. dubbo的jmeter压测时jar包的热加载/动态加载

    在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包 ...

  6. 【结果发布】第六届SeedCoder编程大赛初赛结果发布

    微软俱乐部科技文化月seedcoder2014编程大赛已经初审完成. 评审小组选出最棒的作品进入决赛(现场答辩+陈述环节,由评委现场打分).终于排名由"初赛分数+现场答辩分"决定. ...

  7. imx6q GPIO功能的用法

    假如我们要使用扩展口的第11脚EIM_D18. 先在arch/arm/plat-mxc/include/mach/iomux-mx6q.h中找有EIM_18. 能够找到MX6Q_PAD_EIM_D18 ...

  8. C#高级编程五十二天----有序列表

    有序列表 假设须要基于对全部集合排序,就能够使用SortedList<TKey,TValue>类.这个类依照键给元素排序.这个集合中的值和键都能够使用随意类型. 以下的样例创建了一个有序列 ...

  9. php 获取今天,本周,本月,三个月内,半年内,今年的开始和结束时间

    $now = time();         //今天        $today_audit_num = 0;        $today_use_num = 0;        $beginTim ...

  10. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题

    IT咨询顾问:一次吐血的项目救火   年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...