接上篇,要想更自由灵活的配置工具栏,还是得自己定制一个,暂时取名为FreeToolbar。
效果图跟之前是一样的:
FreeToolbar有两种用法,一种是把FreeToolbar和PopupMenu作为组件在你的代码里直接引用,还有一种更省事的方法是继承封装好的ToolbarActivity,这里只介绍后一种。
使用方法分为下面4步:
Step 1:把下面这些文件拷进你的工程:
- widget/目录下的源文件
- drawable/目录下的图片资源(可以替换成你自己的图片)
- res/layout/toolbar.xml
- res/values/attrs.xml
- res/values/dimens.xml
Step 2: 将你自己的activity继承FreeToolbarActivity,
Step 3: 覆盖onCreateFreeToolbar()方法,配置一下工具栏的layout。之后就可以通过getFreeToolbar()进行一些其他的初始化操作了。
@Override protected void onCreateFreeToolbar(ViewGroup root) { getLayoutInflater().inflate(R.layout.toolbar, root); super.onCreateFreeToolbar(root); // put other initialization here... e.g.: getFreeToolbar().setTitle("Hit me"); }
Step 4: 如果你的工具栏需要overflow菜单,还需要覆盖onCreateOverflowMenu()方法,配置一下菜单的layout:
@Override protected boolean onCreateOverflowMenu(View menuLayout) { View layout = getLayoutInflater().inflate(R.layout.toolbar_menu, null); return super.onCreateOverflowMenu(layout); }
用起来是不是还挺简单的?那么FreeToolbar有哪些属性可以配置呢?可以参见attrs.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="FreeToolbar"> <attr name="menu_offset_x" format="dimension" /> <attr name="menu_offset_y" format="dimension" /> <attr name="menu_width" format="dimension" /> <attr name="menu_height" format="dimension" /> <attr name="title_padding_when_no_navi_icon" format="dimension" /> </declare-styleable> </resources>
一共有5个属性,可以在res/layout/toolbar.xml里进行配置:
- menu_offset_x: 菜单相对于菜单按钮(那三个点)的水平偏移,注意原点是菜单按钮的左下角
- menu_offset_y: 菜单相对于菜单按钮(那三个点)的垂直偏移,注意原点是菜单按钮的左下角
- menu_width: 菜单的宽度
- menu_height: 菜单的高度
- title_padding_when_no_navi_icon: 当左边没有回退按钮时,标题相对于左边缘的偏移(默认是16dp)
前面提到了可以用getFreeToolbar()获取FreeToolbar对象,然后进行一些配置。具体配置的API列表如下:
- void setTitle(String title):设置标题文字
- String getTitle():获取标题文字
- void setNavigationEnabled(boolean enabled):启用导航按钮(也就是回退按钮)
- void setOverflowMenuEnabled(boolean enabled):启用溢出菜单
- void setTitleOnClickListener(View.OnClickListener listener):设置标题点击监听器
- void setNavigationOnClickListener(View.OnClickListener listener):设置导航按钮点击监听器
- float getOverflowMenuWidth():获取溢出菜单宽度
- void setOverflowMenuWidth(float overflowMenuWidth):设置溢出菜单宽度
- float getOverflowMenuHeight():获取溢出菜单高度
- void setOverflowMenuHeight(float overflowMenuHeight):设置溢出菜单高度
- float getOverflowMenuOffsetX():获取溢出菜单水平偏移
- void setOverflowMenuOffsetX(float overflowMenuOffsetX):设置溢出菜单水平偏移
- float getOverflowMenuOffsetY():获取溢出菜单垂直偏移
- void setOverflowMenuOffsetY(float overflowMenuOffsetY):设置溢出菜单垂直偏移
- float getTitlePaddingWhenNoNaviIcon():获取无导航按钮时标题左边的偏移
- void setTitlePaddingWhenNoNaviIcon(float titlePaddingWhenNoNaviIcon):设置无导航按钮时标题左边的偏移
具体实现代码很简单,主要就是三部分:
1. PopupMenu:继承自PopupWindow,主要就是增加菜单项的touch listener,完成菜单底色、按压色配置,提供接口onMenuItemSelected()完成点击事件响应
2. FreeToolbar:继承自LinearLayout,封装标题、导航按钮、溢出菜单的配置
3. ToolbarActivity:覆盖setContentView()方法通过addView()的方式添加FreeToolbar,然后提供两个新的生命周期方法onCreateFreeToolbar()和onCreateOverflowMenu()供子类覆盖实现
示例代码下载(CSDN)