app 在 Android 7.0 上登錄的時候, Dialog 不顯示了,但是半透明背景顯示
經過搜索和對比,發現出現該問題是因為重寫了 getResources() 方法造成的 。重寫該方法是為了 app 的字體不會隨着手機字體的改變而變化,造成布局混亂,設置字體用到變量 fontScale ,其他的參數不用。
原始代碼:
1 /** 2 * 設置 app 不隨着系統字體的調整而變化 3 */ 4 @Override 5 public Resources getResources() { 6 Resources resources = super.getResources(); 7 Configuration configuration = resources.getConfiguration(); 8 configuration.setToDefaults(); 9 resources.updateConfiguration(configuration, resources.getDisplayMetrics()); 10 return resources; 11 }
源碼:configuration.setToDefault() 方法
1 /** 2 * Set this object to the system defaults. 3 */ 4 public void setToDefaults() { 5 fontScale = 1; 6 mcc = mnc = 0; 7 locale = null; 8 userSetLocale = false; 9 touchscreen = TOUCHSCREEN_UNDEFINED; 10 keyboard = KEYBOARD_UNDEFINED; 11 keyboardHidden = KEYBOARDHIDDEN_UNDEFINED; 12 hardKeyboardHidden = HARDKEYBOARDHIDDEN_UNDEFINED; 13 navigation = NAVIGATION_UNDEFINED; 14 navigationHidden = NAVIGATIONHIDDEN_UNDEFINED; 15 orientation = ORIENTATION_UNDEFINED; 16 screenLayout = SCREENLAYOUT_UNDEFINED; 17 uiMode = UI_MODE_TYPE_UNDEFINED; 18 screenWidthDp = compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED; 19 screenHeightDp = compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED; 20 smallestScreenWidthDp = compatSmallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED; 21 densityDpi = DENSITY_DPI_UNDEFINED; 22 seq = 0; 23 }
在 Android 7.0 上的 PhoneWindow 代碼有了變化, DecorView 從 PhoneWindow 中獨立出來一個類,同時在初始化的時候,調用了 updateAvailableWidth() 方法
1 private void updateAvailableWidth() {
2 Resources res = getResources(); 3 mAvailableWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4 res.getConfiguration().screenWidthDp, res.getDisplayMetrics()); 5 }
其中會調用 getResources() 方法,但是該方法設置為 setToDefault(),那么獲取到的 screenWidthDp 為默認值 SCREEN_WIDTH_DP_UNDEFINED
1 /** 2 * Default value for {@link #screenWidthDp} indicating that no width 3 * has been specified. 4 */ 5 public static final int SCREEN_WIDTH_DP_UNDEFINED = 0;
代碼中默認值為 0 ,那么 mAvaliableWidth 值為 0 ,所以造成 Dialog 無法顯示的問題。
解決辦法:
只設置 getResource() 方法中的 fontScale 為 1 ,其他的值不修改。
修改后代碼:
1 /** 2 * 設置 app 不隨着系統字體的調整而變化 3 */ 4 @Override 5 public Resources getResources() { 6 Resources resources = super.getResources(); 7 Configuration configuration = resources.getConfiguration(); 8 configuration.fontScale = 1; 9 resources.updateConfiguration(configuration, resources.getDisplayMetrics()); 10 return resources; 11 }
參考:http://www.jianshu.com/p/9be83be8d1ef
