我正在尝试以编程方式在使用旧版Android OS的嵌入式系统的导航栏上进行一些更改。我缩小到处理下面导航栏的类。
https://android.googlesource.com/platform/frameworks/base/+/7d8abae/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
该对象似乎在这里声明:
https://android.googlesource.com/platform/frameworks/base/+/598a7aedfb6b77fc98bace9f420968a6f3ed637e/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
238行
私有NavigationBarView mNavigationBarView = null;
有没有办法以编程方式获取指向该对象的指针?我唯一能找到的就是获得更大容器的代码,就像您以编程方式隐藏导航栏时一样。
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
但是,这还不够。我想深入到导航栏可绘制对象。
任何线索都将不胜感激。
谢谢。
附言由于它是嵌入式系统,因此如果我更改操作系统,也可以,因为它永远不会出现在Google商店中。
最佳答案
无法通过反射获取PhoneStatusBar中的mNavigationBarView
对象。
该对象位于进程com.android.systemui
中,您自己的进程无法使用反射访问另一个进程的对象。
一种可能的方法是使用Xposed框架。通过PhoneStatusBar的方法中的一些挂钩,您可以访问mNavigationBarView
对象。
已经有一些模块可以修改navigationBar,例如:Xperia/AOSP NavBar Buttons 。您可以按照本教程modify SystemUI's clock style using Xposed framework进行操作。