Android: Toolbar、AppBarLayout
ToolBar是google退出的一个应用程序动作条
包括:
- 设置导航栏图标
- 设置应用程序Logo
- 设置标题
- 设置子标题
- 添加各种自定义控件
- 添加动作条菜单
API:https://developer.android.com/reference/android/support/v7/widget/Toolbar.html
1. 兼容处理,使用v7兼容包,build.gradle配置
compile 'com.android.support:appcompat-v7:24.0.0'
2. 隐藏默认的动作条,可以使用NoActionBar的theme,也可以在activity使用代码
3. 布局文件中可以支持出了动作条菜单actionmenu外的所有功能,
但是一定要添加自定义命名空间,指向 http://schemas.android.com/apk/res-auto
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways"
app:navigationIcon="@mipmap/ic_back"
app:logo="@mipmap/ic_launcher"
app:title="@string/app_name"
app:subtitle="@string/home_title"
app:subtitleTextColor="@color/bt_accent"
> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TestCustomView" /> </android.support.v7.widget.Toolbar> </android.support.design.widget.AppBarLayout>
4. 通过代码实现Toolbar的创建及menu事件监听
activity
package com.media.customplayer; import android.support.design.widget.NavigationView;
import android.support.design.widget.NavigationView.OnNavigationItemSelectedListener;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.DrawerLayout.DrawerListener;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.support.v7.widget.Toolbar.OnMenuItemClickListener;
import android.util.Log;
import android.view.MenuItem;
import android.view.View; public class PlayerActivity extends AppCompatActivity { private final String TAG = "PlayerActivity";
private DrawerLayout mPlayerDrawer;
private NavigationView mNaviView;
private Toolbar mToolbar; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player); mPlayerDrawer = (DrawerLayout) findViewById(R.id.palyer_drawer_layout);
mPlayerDrawer.addDrawerListener(drawerListener); mNaviView = (NavigationView) findViewById(R.id.navi_view);
mNaviView.setNavigationItemSelectedListener(naviItemSelectedListener); updateToolbar();
} private DrawerListener drawerListener = new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
Log.v(TAG, "onDrawerSlide: slideOffset = " + slideOffset);
} @Override
public void onDrawerOpened(View drawerView) {
Log.v(TAG, "onDrawerOpened");
} @Override
public void onDrawerClosed(View drawerView) {
Log.v(TAG, "onDrawerClosed");
} @Override
public void onDrawerStateChanged(int newState) {
Log.v(TAG, "onDrawerStateChanged: newState = " + newState);
}
}; private OnNavigationItemSelectedListener naviItemSelectedListener = new OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.navi_all:
Log.v(TAG, "播放所有音乐");
break;
case R.id.navi_playlists:
Log.v(TAG, "播放音乐列表");
break;
default:
Log.v(TAG, "点击按钮: " + item.getItemId());
} item.setChecked(true);
mPlayerDrawer.closeDrawer(GravityCompat.START, true);
return true;
}
}; private OnMenuItemClickListener menuItemClickListener = new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.navi_all:
Log.v(TAG, "播放所有音乐");
break;
case R.id.navi_playlists:
Log.v(TAG, "播放音乐列表");
break;
default:
Log.v(TAG, "点击按钮: " + item.getItemId());
} item.setChecked(true);
return true;
}
}; private void updateToolbar() {
mToolbar = (Toolbar) findViewById(R.id.player_toolbar); mToolbar.setNavigationIcon(R.mipmap.ic_back);
mToolbar.setLogo(R.mipmap.ic_launcher);
mToolbar.setTitle(R.string.app_name);
mToolbar.setSubtitle(R.string.home_title); mToolbar.inflateMenu(R.menu.player_toolbar_menu);
mToolbar.setOnMenuItemClickListener(menuItemClickListener);
} }
menu layout
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<group android:checkableBehavior="single">
<item
android:id="@+id/navi_all"
android:icon="@mipmap/ic_allmusic_black_24dp"
android:title="@string/drawer_allmusic_title"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/navi_playlists"
android:icon="@mipmap/ic_playlist_music_black_24dp"
android:title="@string/drawer_playlists_title"
android:checked="true" />
<item
android:id="@+id/navi_sub_item_bottom_1"
android:icon="@mipmap/ic_allmusic_black_24dp"
android:title="@string/drawer_sub_playlist_title" />
<item
android:id="@+id/navi_sub_item_bottom_2"
android:icon="@mipmap/ic_allmusic_black_24dp"
android:title="@string/drawer_sub_playlist_title" />
</group>
</menu>
5. 修改action menu的颜色
style.xml
<resources>
<!-- Base application theme. -->
<style name="PlayerTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">#ffff5722</item>
<item name="colorPrimaryDark">#ffbf360c</item>
<item name="colorAccent">#ffff5722</item>
<item name="alertDialogTheme">@style/Theme.AppCompat.Dialog.Alert</item>
</style>
<style name="PlayerTheme.ToolBar" parent="PlayerTheme">
<item name="android:textColorPrimary">#00B8D4</item>
</style>
</resources>
activity
mToolbar.setPopupTheme(R.style.PlayerTheme_ToolBar);
可以是布局文件
app:popupTheme="@style/PlayerTheme.ToolBar"
AppBarLayout
AppBarLayout是一个垂直方向的LinearLayout,是为MaterialDesign设计的AppBar(包括的view都会认为是appbar),支持手势滑动。
Android: Toolbar、AppBarLayout的更多相关文章
- Android CoordinatorLayout、AppBarLayout、DrawerLayout、NavigationView 的使用及问题小结
这里只对Material Design中这几种组件使用的重要部分以及容易出现问题的地方进行汇总(遇坑请直接看最后常见问题部分),详细用法请自行查阅官方文档 一.CoordinatorLayout 介绍 ...
- Android colorAccent、colorPrimary、colorPrimaryDark actionbar toolbar navigationbar
伴随着Android5.0的发布也更新了support-v7-appcompat 到V21,其中增加了ToolBar.recyclerview.cardview等控件. Android5.0对改变AP ...
- [置顶]
xamarin android toolbar(踩坑完全入门详解)
网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费.如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到 ...
- GJM : Unity3D HIAR -【 快速入门 】 五、导出 Android 工程、应用
导出 Android 工程.应用 在开始之前,请务必先保存您的工程,同时确认您已经安装 Android SDK 和 JDK.安装操作请参考以下链接: 搭建开发环境 Step 1. 设置 Android ...
- android:layout_height、android:layout_width、android:height、android:width的关系与区别
一直一来对android:layout_height.android:layout_width.android:height.android:width这几个属性的关系有些不理解,既然有了androi ...
- [安卓]Android窗口、视图、布局
1.窗口全屏的两种方法: 转自:http://blog.sina.com.cn/s/blog_4c451e0e010133ab.html 设置全屏包括两个部分: 窗口全屏和Activity全屏.窗口全 ...
- 利用Android Studio、MAT对Android进行内存泄漏检测
利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...
- Android相机、相册获取图片显示并保存到SD卡
Android相机.相册获取图片显示并保存到SD卡 [复制链接] 电梯直达 楼主 发表于 2013-3-13 19:51:43 | 只看该作者 |只看大图 本帖最后由 happy小妖同学 ...
- 记录android学习、开发过程温故知新
记录android学习.开发过程温故知新
随机推荐
- Round-Robin负载均衡算法及其实现原理
毫无疑问,随着互联网.移动网络接入成本的降低,互联网正在日益深入地走入我们的生活,越来越成为人们获取信息的高效平台,ICP行业也顺势呈现出强劲的成长趋势,成为互联网迅猛发展形势下最大的受益者,也直接促 ...
- SSM(Maven集成)
ssm全称:Spring+SpringMVC+Mybatis ssm简介: 1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod J ...
- NodeJS Stream 四:Writable
什么是可写流 可写流是对数据流向设备的抽象,用来消费上游流过来的数据,通过可写流程序可以把数据写入设备,常见的是本地磁盘文件或者 TCP.HTTP 等网络响应. 看一个之前用过的例子 process. ...
- OpenCV 3.2正式发布啦
2016年12月23号OpenCV社区宣布了OpenCV3.2版本正式发布,这个是在OpenCV3.1版本发布一年以后再次升级.在3.2版本中有总数超过数千个的改进与修正,是OpenCV3.x系列中最 ...
- [CSS3] 学习笔记--CSS盒子模型
1.CSS盒子模型概述 盒子模型的内容范围包括:margin(外边距).border(边框).padding(内边距).content(内容)部分组成. 2.内边距 内边距在content外,bord ...
- asp.net权限认证:Forms认证
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- C++ 头文件系列 (bitset)
简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...
- 重新认识一个强大的 Gson
从一个 Bug 说起 不知道你们发现没有,你写完的程序无论当时怎么测试,过一段时间总会出 Bug .再说一个每天都在发生的例子:在你写完一篇博客后,立即检查的话,总是查不出自己写的错别字. 据说这些都 ...
- Match类解析
Matcher类:使用Matcher类,最重要的一个概念必须清楚:组(Group),在正则表达式中()定义了一个组,由于一个正则表达式可以包含很多的组,所以下面先说说怎么划分组的,以及这些组和组的下标 ...
- 前端Cookie与Session的区别
我们在实际生活中总会遇到这样的事情,我们一旦登录(首次输入用户名和密码)某个网站之后,当我们再次访问的时候(只要不关闭浏览器),无需再次登录.而当我们在这个网站浏览一段时间后,它会产生我们浏览的记录, ...