Android N相比较于Android M有了很大的变化,下面记录一下Android N上Navigationbar的分析。
android N上Navigationbar主要的布局文件就是navigationbar_layout.xml和navigationbar_layout_rot90.xml,两个文件就是横竖屏时调用不同的布局文件,但是显示的内容都是一样,写法略有区别,如果是要在Navigationbar上添加View的话,记得至少要修改这两个布局文件,否则会导致横竖屏时,一侧有View,一侧没有引发的NullPointerException(下文中都以navigationbar_layout.xml为例)。
android N上,NavigationBar的按钮区域被划分成了两个个区域--center_group,end_group;back,home,recents三个按键在center_group中,end_group放的是键盘提示等icon。
显示几个按键是有config_navBarLayout这个子串控制的,如果需要添加额外的显示icon,就要修改该子串。
<!-- Nav bar button default ordering/layout -->
<string name="config_navBarLayout" translatable="false">space;back,home,recent;space</string>
流程:
1.NavigationBarInflaterView.inflateLayout(....)开始获取要显示icon对应的子串,通过getDefaultLayout()方法拿到对应的子串。
2.拿到的子串会进行处理,根据关键字分成三个子串。
3.inflateButtons(....),通过inflateButtons(....)方法把对应的字串和要显示在的区域布局绑定在一起。
4.inflateButton()是就开始遍历字串,对于已经定义的字串,调用不同的布局文件(在android N上,每一个按钮都有一个独立的布局文件,如果想要添加新的按钮,一定要添加新的布局文件以供引用加载),加载在布局中。
4.addToDispatchers(...) 把按钮都记录在一个数组中,这个数组再后面会用到。
private SparseArray<ButtonDispatcher> mButtonDispatchers;
5.NavigationBarView.NavigationBarView(...) 记录btn的ID和对应的控件。
mButtonDisatchers.put(R.id.back, new ButtonDispatcher(R.id.back));
6.setDisabledFlags(..)控制icon的隐藏和显示
7.PhoneStatusBar.prepareNavigationBarView()中给按钮绑定点击和长按的事件。