Android 7.0 Dialog 無法顯示的問題


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM