Android5.0之Toobar的使用
总体上来说,Toolbar的使用可以分为两个方面,一方面是将ToolBar当作ActionBar来用,另一方面就是将Toolbar当成一个单独的控件来用,不过到目前为止我见到的大部分情况都是把Toolbar当作ActionBar来用,下面我们分别就这两种使用方式来进行说明。
1.Toolbar作为ActionBar使用
将Toolbar当作ActionBar使用首先要隐藏系统默认的ActionBar,隐藏方式其实很简单,只需要简单设置一下style就可以了,如下了:
<style name="AppTheme.NoActionBar">
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
Android手机在3.0之前标题栏叫做titlebar,3.0之后又推出了ActionBar来代替titlebar,所以我们在使用的Toolbar的时候为了兼容早期的手机也要把titlebar隐藏掉。这两个东东都隐藏之后,在清单文件中给Activity或者App设置一下主题就可以了,我这里给Activity设置主题,如下:
<activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
如此,我的MainActivity就成功的隐藏掉了ActionBar了,接下来就是怎么添加Toolbar了,我们知道在企业开发中ActionBar使用并不多,一个重要的原因就是这个东西太死板了,而且太丑了,那么Google推出Toolbar必然就要避免这些问题,so,Toolbar除了好看另一个最大的优点就是灵活,你完全可以把它当作一个普普通通的控件来使用,普通控件怎么使用呢?先在布局文件中写呗,同时,我们为了兼容Android5.0之前的手机,在使用Toolbar的时候都是使用v7包里的Toolbar,布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"
tools:context="org.mobiletrain.toolbar2.MainActivity"> <android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:popupTheme="@style/AppTheme.PopupOverlay">
</android.support.v7.widget.Toolbar>
</LinearLayout>
OK,是不是很简单呢?一个简单的布局文件就搞定了,那么这里有三个地方需要给大家解释一下,首先是toolbar的高,你可以给一个固定值,也可以参考之前ActionBar的高度,参考ActionBar高度的好处是系统会在不同的设备上自动为你调整Toolbar的高度。第二点就是background属性,使用toolbar时我们可以给toolbar设定一个背景颜色。第三就是popupTheme属性,就是弹出框的显示,这里我们一般按如下的方式来设置:
<style name="AppTheme.PopupOverlay" parent="Theme.AppCompat.Light">
OK,布局文件搞定之后,下来我们就来看看在MainActivity中该怎么处理:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("主标题");
toolbar.setSubtitle("二级标题");
//设置应用Logo
toolbar.setLogo(R.drawable.a5k);
//设置导航图标
toolbar.setNavigationIcon(R.drawable.ic_menu_back);
//用ToolBar代替ActionBar
setSupportActionBar(toolbar);
在布局文件中我们还是像处理普通控件一样,先是获得到这个Toolbar,然后给toolbar设置各种属性,至于这些属性具体指什么大家看下面一张图就明白了(a5k是微信中的图片,ic_menu_back是一个向前的箭头):
可是这个导航箭头太丑了,其实这里我们用系统默认的箭头就可以了,设置方式如下:
//设置导航图标
// toolbar.setNavigationIcon(R.drawable.ic_menu_back);
//用ToolBar代替ActionBar
setSupportActionBar(toolbar);
//显示导航按钮并使之处于可点击状态
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
大家注意这里要注释掉之前设置导航图标的代码,同时getSupportActionBar().setDisplayHomeAsUpEnabled(true);要放在setSupportActionBar(toolbar);这个之后执行,因为真正的ActionBar已经被我们隐藏了,在用toolbar代替actionbar之前如果调用getSupportActionBar()会无法获取ActionBar。这样做之后,显示效果如下:
这个默认的后退按钮比起ActionBar中的后退按钮漂亮多了吧。如果你用过ActionBar里边的后退按钮你就会知道它有多丑。
OK,接下来,如果我想要在Toolbar上显示菜单项该怎么办呢?以前ActionBar的时候你怎么办现在还怎么办!
先写菜单文件,如下:
<?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">
<item
android:id="@+id/setting"
android:icon="@drawable/a5k"
android:orderInCategory="99"
android:title="setting"
app:showAsAction="never"/>
<item
android:id="@+id/search"
android:title="search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"/>
<item
android:id="@+id/share"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
app:showAsAction="never"
android:title="share"></item>
</menu>
大家注意这里有两个地方和以前不一样,一个就是showAsAction的命名空间变为了自定义的app,还有就是actionViewClass和actionProviderClass的命名空间也变为app。OK,菜单文件写完之后,在Activity中创建菜单即可,如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
和以前创建菜单的方式一模一样,我们再来看看显示效果:
貌似没有什么难度,然后菜单事件的处理依然在onOptionsItemSelected方法中,如下:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Log.d("lenve", "onOptionsItemSelected() returned: " + 456);
break;
}
return super.onOptionsItemSelected(item);
}
2.单独使用Toolbar
你既可以把Toolbar当作ActionBar来用,也可以当作普通控件来用,虽然这种用法比较少见。当作普通控件来用的话,那我就没有必要隐藏ActionBar了(不给新的Activity在清单文件中设置我们在文章开头创建的AppTheme.NoActionBar主题即可)。那我依然是先在布局文件中来写一个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"
tools:context="org.mobiletrain.toolbar2.Main2Activity"> <android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_centerInParent="true"
android:background="@color/colorPrimary"
android:popupTheme="@style/AppTheme.PopupOverlay">
</android.support.v7.widget.Toolbar>
</RelativeLayout>
显示效果如下:
OK,Toolbar已经显示在屏幕正中央了,但是既然把它当作一个普通控件来使用,我们在怎么向Toolbar中添加菜单项呢?如下,需要Toolbar自己加载:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.inflateMenu(R.menu.main);
}
显示效果如下:
OK,接下来一个问题是怎么给这些控件设置点击事件呢,如下:
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
Log.d("lenve", "onMenuItemClick() returned: search");
break;
case R.id.setting:
Log.d("lenve", "onMenuItemClick() returned: setting");
break;
case R.id.share:
Log.d("lenve", "onMenuItemClick() returned: share");
break;
}
return true;
}
});
OK,基本Toolbar的使用就是这样的。
Android5.0之Toobar的使用的更多相关文章
- android5.0联系人 sort_key改成phonebook_label
项目中用到了联系人根据字母排序,在android4.0手机上是可以的,但是在android4.4以上的手机排序是乱的,一般字母排序都是根据sort_key这个拼音进行排序,而android5.0这个字 ...
- ANdroid5.0不能隐式启动service,必须显示,解决办法,加服务端包名
Intent intent = new Intent(); intent.setAction("com.viaembedded.veonvif.RemoteService");// ...
- 一个Activity掌握Android5.0新控件 (转)
原文地址:http://blog.csdn.net/lavor_zl/article/details/51279386 谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常 ...
- android5.0 编译
android5.0编译需要jdk1.7版本,将来本地可能需要同时维护两套jdk版本,请参考: 在线安装openjdk1.7 sudo apt-get install openjdk-7-jre op ...
- Eclipse搭建Android5.0应用开发环境 “ndk-build”:launchingfailed问题解决
Eclipse搭建Android5.0应用开发环境 "ndk-build":launchingfailed问题解决 详细参考http://blog.csdn.net/loongem ...
- 友情提醒:欲开发android5.0以上应用,请全部更新开发工具至最新
周末帮人完成一个项目,android5.0以上版本,谁知道被开发工具折腾的死去活来.我的开发环境是adt-bundle-windows-x86-20140702.zip版本,也是目前能找到的adt-b ...
- Android Material Design Ripple Effect在Android5.0(SDK=21)以下Android版本崩溃问题解决
Android Material Design Ripple Effect在Android5.0(SDK=21)以下Android版本崩溃问题解决 附录1的Android Ripple Effect水 ...
- ANDROID5.0触摸屏校准
1.校准原理: 1)首先生成校准用的参数,可以适用tslib生成校准参数,也可以使用校准app生成:使用校准app进行校准对使用者要求比较低,使用者可以不用学习复杂的命令:本文使用app方式 2)生成 ...
- Android5.0之Activity的转场动画
Activity的转场动画很早就有,但是太过于单调,样式也不好看,于是Google在Android5.0之后,又推出的新的转场动画,效果还是非常炫的,今天我们一起来看一下. 1.旧转场动画回顾 首先我 ...
随机推荐
- vc:如何从Internet上有效而稳定地下载文件
http://www.vckbase.com/index.php/wv/172 如何从Internet上有效而稳定地下载文件 ,这是很多网络应用程序要考虑的重要问题,本文提供的代码段针对这个问题进行了 ...
- Fedora 17下交叉编译vlc-2.0.6-win32小记
关于编译windows下的vlc网上的教程除了翻译N年前wiki官网的那些蚂蚁文之外,可以说基本没啥参考意义和价值.因为那些都是非常老的版本,0.8.x或者1.x.x,而我这个人有喜欢新鲜事儿,所以就 ...
- Oracle EBS 预警系统管理
本章主要讲述配置和设置Oracle EBS预警系统管理, 它比较方便和及时发用户或系统对数据库操作情况.下面讲一操作步聚: 1.预警系统管理-->系统-->选项 名称"Unix ...
- bzoj2565
网络流就先告一段落了 在进行其他训练之前,我决定先练一道后缀数组(对这个我还是比较有自信的) 虽然之前没用后缀数组解决过回文问题,但是稍微想想就知道, 要解决最长双倍回文,首先要解决最长回文序列, 要 ...
- 解决Dagger2和butterknife冲突
dagger2 和 RxJava butterknife 以及 Retrofit使用起来非常酸爽 代码非常干净清晰 动手尝试 配置编译 DaggerAppComponent的时候 出现问题 配置dag ...
- Esper系列(十)NamedWindow语法delete、Select+Delete、Update
On-Delete With Named Windows 功能:在Named Windows中删除事件. 格式: 1 , 4 field_b = win.field_a, 5 field_ ...
- 代码修改mysql字符
为了不再显示的时候乱码,要修改数据库默认编码.以下以GBK编码页面为例进行说明: 1.修改MYSQL的配置文件:my.ini里面修改default-character-set=gbk2.代码运行时修改 ...
- 坑爹的IE quirk模式【转】
调试一个页面,ie下面页面css样式很是奇怪,各种失效.找了半天原因不知道怎么回事.最后在调试工具中发现,文档模式为quirk,改成别的(IE 7|8|9)正常. 为什么会自动选择此文档模式呢? 先看 ...
- 成都Uber优步司机奖励政策(2月6日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Go语言简介
Go语言简介 - Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率. Go语言简介 Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率. Go ...