看了下公司的系統代碼對於根佈局decor_layout.xml的修改, 有所獲. 前些時候才開始做系統開發的時候, 總想改改系統的源碼, 至於原因: 人總是想裝裝, 在踩過幾個別人修改的坑後, 還是覺得在不改源碼的基礎上, 儘量納源碼為自己所用還是挺好的. 代碼如下: 該段代碼的核心, 就在上面的 ...
看了下公司的系統代碼對於根佈局decor_layout.xml的修改, 有所獲.
前些時候才開始做系統開發的時候, 總想改改系統的源碼, 至於原因: 人總是想裝裝, 在踩過幾個別人修改的坑後, 還是覺得在不改源碼的基礎上, 儘量納源碼為自己所用還是挺好的.
代碼如下:
1 public void wrapDecor(Activity activity) { 2 3 mWindow = activity.getWindow(); 4 if(mWindow == null){ 5 Log.e(TAG, "Window is null"); 6 return; 7 } 8 9 View decorView = mWindow.getDecorView(); 10 if (decorView == null) { 11 Log.e(TAG, "DecorView is null"); 12 return; 13 } 14 15 ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content); 16 if (contentView == null) { 17 Log.e(TAG, "DecorView is null, have you called wrapDecor after Activity#super.onCreate?"); 18 return; 19 } 20 21 final int childCount = contentView.getChildCount(); 22 if (childCount == 0) { 23 // Maybe called before Activity#setContentView 24 mPotentialErrorFlag |= FLAG_POTENTIAL_ERROR_SET_CONTENT; 25 } 26 27 View[] children = new View[childCount]; 28 for (int i = 0; i < childCount; i++) { 29 children[i] = contentView.getChildAt(i); 30 } 31 32 contentView.removeAllViews(); 33 34 LayoutInflater inflater = LayoutInflater.from(activity); 35 36 //===================== begin ======================== 37 38 // 此處即為自定義的decor_layout.xml文件 39 View wrapper = inflater.inflate(R.layout.decor_layout, null); 40 41 ViewGroup rawContentView = (ViewGroup) wrapper.findViewById(R.id.content); 42 if (childCount > 0) { 43 for (View child : children) { 44 rawContentView.addView(child); 45 } 46 } 47 //change for listActivity, add view first then setContenView 48 activity.setContentView(wrapper); 49 50 //===================== end ======================= 51 52 // 獲取自定義decor_layout中的控制項 53 mOptionsKey = wrapper.findViewById(R.id.feature_bar_options); 54 55 // 此處獲取的是ActionBar的控制項, 由於項目中需要大量使用到ActionBar, 56 // 此處對覆蓋ActionBar對OptionMenu的控制 57 ActionBarView actionBarView = (ActionBarView) decorView.findViewById( 58 com.android.internal.R.id.action_bar); 59 if (actionBarView != null) { 60 // 覆蓋ActionBar對OptionMenu的控制 61 actionBarView.setOverrideOverflowButton(mOptionsKey); 62 } else { 63 Log.d(TAG, "actionBarView is null"); 64 if (mWindow != null) { 65 Log.d(TAG, "Attempt to invoke setShouldOverrideResources access PhoneWindow"); 66 mWindow.setShouldOverrideResources(true); 67 } else { 68 Log.d(TAG, "mWindow is empty, pls check it"); 69 } 70 } 71 }
該段代碼的核心, 就在上面的 begin 和 end 之間, 代碼挺簡單, 使用到包裝的思想, 也就是包裝設計模式.