先说下场景,公司做的是一个横屏的系统,之前使用的6735的代码,这个是竖屏手机的代码,但是被驱动工程师改成了横屏,因此开机当然是横屏的。但是右侧的虚拟按键死活显示不出来,只是显示了一条大黑边:
为了使大家看得更明白点,我直接上图:
大黑条所在的位置应该显示的是虚拟按键,但是这里什么都没有;通过修改系统配置文件隐藏大黑条后则为全屏显示,黑条消失,但是还是看不到虚拟按键;我试过以下几种办法,都告失败:
1. 修改NavigationBar的高度(这里是宽度);
2. 修改NavigationBar中的按钮颜色;
3. 修改NavigationBar的布局背景颜色为白色(无效,仍然是黑色);
4. 替换布局文件为Asop提供的布局(不报错,无效);
5. 使用ADB指令隐藏导航条(可以隐藏,向左滑动拉出导航条,还是大黑条);
6. 修改代码强制显示导航条(无效,还是大黑边);
然后我开始怀疑是不是这个板子的源码定制有问题,或者说导航条的显示模块没启动,为了更加全面的了解,我从Android系统按下电源键开始了解整个Android系统从开机到SystemUI加载导航条的整个过程分析,有兴趣的朋友可以参考我前面写的几篇文章:《Android系统启动流程分析(一)》
接来下就是一个个排除:
1. SystemUIService是否启动?答案是:是
2. SystemUIApplication是否启动?答案是:是
3. NavigationBarView是否构造了布局文件?答案是:是
4. NavigationBarView是否被设置NavigationBarView?答案是:否
5. 按钮是不是被设置NavigationBarView?答案是:否
6. 是不是右边的导航栏宽度太大导致图标没显示出来?答案是:否
然后我凌乱了。。。。。。
然后开始浏览NavigationBar的源码,发现reorient方法,里面有关于方向的描述,我想了想,是不是因为源码是竖屏的但是手机默认变成了横屏才导致布局没有显示出来呢?
我们看下reorient方法:
public void reorient() {
final int rot = mDisplay.getRotation();
for (int i=0; i<4; i++) {
mRotatedViews[i].setVisibility(View.GONE);
}
mCurrentView = mRotatedViews[rot];
mCurrentView.setVisibility(View.VISIBLE);
getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener);
mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone);
// force the low profile & disabled states into compliance
mBarTransitions.init(mVertical);
setDisabledFlags(mDisabledFlags, true /* force */);
Log.d("larsonzhong", "reorient() rot="+rot);
setMenuVisibility(mShowMenu, true /* force */);
if (DEBUG) {
Log.d(TAG, "reorient(): rot=" + mDisplay.getRotation());
}
// swap to x coordinate if orientation is not in vertical
if (mDelegateHelper != null) {
mDelegateHelper.setSwapXY(mVertical);
}
updateTaskSwitchHelper();
setNavigationIconHints(mNavigationIconHints, true);
}
首先我在reorient方法里面加了一个日志打印,看看是不是从开机到后面一直没有执行旋转操作;
01-01 00:02:22.743 952-952/com.android.systemui D/larsonzhong: reorient() rot=0
01-01 00:02:24.213 952-952/com.android.systemui D/larsonzhong: reorient() rot=0
然后恍然大悟,果真是一直都没有执行旋转操作,也就是说一直用的竖屏的layout,但是驱动又被改成了横屏,所以死活不显示出来。
问题点找到了,然后我把默认的方向对调:
@Override
public void onFinishInflate() {
/*larsonzhong modify rot0 to rot90*/
mRotatedViews[Surface.ROTATION_0] =
mRotatedViews[Surface.ROTATION_180] = findViewById(R.id.rot90);
/*larsonzhong modify rot90 to rot0*/
mRotatedViews[Surface.ROTATION_90] = findViewById(R.id.rot0);
mRotatedViews[Surface.ROTATION_270] = mRotatedViews[Surface.ROTATION_90];
mCurrentView = mRotatedViews[Surface.ROTATION_0];
getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener);
updateRTLOrder();
}
然后重新编译,刷入机器,重启,好鸡冻,久违的导航栏又出现了!!!
喜欢的朋友麻烦点个赞,谢谢;