天天看點

Android Q sprd SystemUI (3) 導航鍵加載

建立的入口在

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/Statusbar.java

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java

Statusbar的makeStatusBarView函數中調用createNavigationBar函數最後調用到NavigationBarController的createNavigationBars

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java

看 NavigationBarFragment 的create方法,是WindowManager去addView了導航欄的布局,最終add了fragment的onCreateView加載的布局navigation_bar.xml,xml中是自定義布局繼續跟代碼frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java

看onFinishInflate()方法,這是view的生命周期,每個view被inflate之後都會回調。看inflateLayout():裡面的newLayout參數很重要!!!根據上一個方法看到getDefaultLayout(),他return了一個在xml寫死的字元串。再看inflateLayout方法,他解析分割了xml裡配置的config_navBarLayout字元串,并傳給了inflateButtons方法.看inflateButtons()方法,周遊加載inflateButton.調到createView()方法,通過字元串比對布局,以home按鍵為例,加載了home的button,其實是加載了 R.layout.home 的layout布局

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java

KeyButtonView通過sendEvent()方法,back等view的點選touch事件交由系統以實體按鍵(keycode)的形式處理的.當然KeyButtonView類還處理了支援長按的button,按鍵的響聲等.

導航鍵的圖示由NavigationBarFragment的onConfigurationChanged()方法 和 NavigationBarView的onAttachedToWindow()和onSizeChanged()方法更新。在NavigationBarView導航欄這個布局加載的時候就會設定圖檔資源,和長度改變,螢幕旋轉都有可能引起重新設定