说起Android app的标题栏,有默认的ActionBar,现在应该没什么人用了,也有设置NoTitle之后去自定义Layout布局加入每个页面中,还有这篇文章想说的ToolBar。
ActionBar,google推出ToolBar来取代ActionBar,说明ActionBar还是有其局限,不能很好的跟上google提倡的Material Design。自定义布局这种方式如果实在喜欢,也不是不可,那为什么我喜欢ToolBar,因为这是google推出的,简单东西简单用,就好比下拉刷新,如果没有特别要求,我也是喜欢google提供的那个刷新控件。
说了半天,该说一下ToolBar这个控件。ToolBar是5.0推出的,一般而言我们都会用v7下的包
<android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#0000ff"/>
首先因为新建的项目都是默认有个标题栏的,所以要先去掉标题栏,去掉标题栏就不赘述了,这里我在代码里去除,oncreate方法中,setcontentView 之前加上 requestWindowFeature(Window.FEATURE_NO_TITLE);
然后在代码里面找到ToolBar控件进行各种设置,不设置的项,不会显示
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.arrow);//设置左边图片
toolbar.setLogo(R.drawable.ic_launcher);//设置app logo
toolbar.setTitle("标题");//设置标题
toolbar.setSubtitle("小标题");//设置小标题
toolbar.inflateMenu(R.menu.menu_main);//设置右侧菜单
这里有个菜单项
res目录下新建一个menu文件夹,存放menu的xml文件
menu的格式如下
menu里面设置菜单项,不限个数,可以为该菜单项设置图片,如果没设置图片,显示的就是title的文字,如果设置了图片,显示图片,同时长按图片会弹出title文字,这里有个showAsAction属性,常用的是ifRoom,表示如果有剩余空间,则显示该项。never,表示永远不会显示该项,如果有一个item设置了never,那么ToolBar的最右端会有一个设置选项,点击会弹出设置了never的菜单项,always,表示总是显示该项。如果你设置了很多个always,那会一直向左挤,使左边的控件隐藏。应该没人这样搞吧。。给自己找事不是么。。
ToolBar上的各种控件,相应的也可以设置一些属性,比如设置标题的字体大小,颜色
左侧图片的点击事件,右侧菜单的点击事件
字体的就不多说了,下面是点击事件的设置
//导航按钮点击
toolbar.setNavigationOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
//TODO dosomething
}
});
//菜单点击
toolbar.setOnMenuItemClickListener(newToolbar.OnMenuItemClickListener() {
@Override
public booleanonMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
caseaction_edit:
break;
caseaction_share:
break;
caseaction_setting:
break;
}
Toast.makeText(MainActivity.this,"onClick"+item.getTitle(),Toast.LENGTH_SHORT).show();
return false;
}
});
实际上讲到这里ToolBar已经可以正常使用了
大概就是这样
但是有时候这么一层不变的UI并不能满足千变万化的需求
比如说这个标题需要居中,原生的ToolBar并没有提供接口让开发去设置,标题一定是靠着logo右端的
标题居中,我们可以这样做,因为ToolBar是一个ViewGroup,所以他可以添加子控件,我们在布局的Toolbar里添加一个TextView来取代原先的标题
<android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#0000ff">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="我是居中的标题"/>
</android.support.v7.widget.Toolbar>
另外一点,就是ToolBar的重用问题,给一个单独的Layout布局,include到需要标题栏的地方,可以减少很多重复代码
如果像我上面这样使用ToolBar,(有另外一种setSupportActionBar(toolbar);)
相比起来,第二种使用toolbar去替换原先的ActionBar,所以他可以调用onCreateOptionsMenu,onPrepareOptionsMenu,之类的方法,来操作右边的menu,而第一种直接在toolbar里调用方法去inflate一个menu。这里是有一个考虑,就是如果相同的toolbar,右端menu可能展示是不一样的,如果有第二中方法,可以在onPrepareOptionsMenu里做各种判断,让menu展示哪个,而第一种,因为不走这个方法,所以不能这样操作。
其实只要在创建toolbar的时候inflate另外的menu布局就行了,还省了许多逻辑判断
最后呢
在用toolbar的时候,上面的高度设置成?attr/actionBarSize,是默认的标题栏高度,如果你设置成wrap_content也是一样的效果,高度是56dp,这应该是google推荐的一个高度,(并且不推荐开发者修改),如果你设置高度太小,那整个标题栏看起来的效果就会差强人意,该居中的不居中了,该对其的没有对齐。如果你的标题栏需要原生的这种效果,那不建议修改高度,如果你是只有一个居中标题的那种,toolbar里加一个TextView设置居中,高度就随便你设置了~不过如此简单的布局toolbar好像大材小用了~
第一次发文,有什么错误的欢迎指出~