我正在尝试以编程方式在使用旧版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进行操作。

08-05 18:42