Android 7.0 Dialog 无法显示的问题

app 在 Android 7.0 上登录的时候, Dialog 不显示了,但是半透明背景显示

经过搜索和对比,发现出现该问题是因为重写了 getResources() 方法造成的 。

 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

时间: 2024-07-30 10:17:11

Android 7.0 Dialog 无法显示的问题的相关文章

Android 8.0+ 通知不显示的适配

最近在 写项目的时候  发现 通知并不会显示的问题,查看资料发现 从Android 8.0开始通知必须加上ChannelId Android O 引入了 通知渠道(Notification Channels),以提供统一的系统来帮助用户管理通知,如果是针对 android O 为目标平台时,必须实现一个或者多个通知渠道,以向用户显示通知.比如聊天软件,为每个聊天组设置一个通知渠道,指定特定声音.灯光等配置 String id = "my_id"; String name="m

Android 6.0 中TimePicker显示为滚动样式的方法

在Android6.0中,TimePicker控件的默认样式为转盘的样式,就像这个样子: 如果想要显示为之前的滚动样式的话也很简单,只要在布局文件中设置TimePicker的timePickerMode属性为spinner就好了,即: [html] view plain copy <TimePicker android:id="@+id/id_add_timePicker" android:layout_width="match_parent" android

Android中改变dialog的显示的位置和大小

private void setDialogSize(Dialog dg) { Window dialogWindow = dg.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); dialogWindow.setGravity(Gravity.LEFT | Gr

Android dialog圆角显示及解决出现的黑色棱角

最近在开发一个天气预报的app,看到一个比较不错友情提示,如下:                怎么样,看起来比原始的dialog好看吧.好了,做法也许有很多,我介绍下我的做法吧, 首先,我第一个想到的就是重写dialog.自定义一个layout布局,引用shape.xml实现圆角. 在此之前,我要说明一下:在我们新建的布局文件,只要不是最外层我们引用shape就不会遇到下面这个问题,看图:           仔细看就是四个角,发现出现四个黑棱角,这个肯定使我们不想要的结果,我在配置文件中怎么

android dialog圆角显示及解决出现的黑色棱角.(友情提示)

http://blog.csdn.net/jj120522/article/details/7871289 最近在开发一个天气预报的app,看到一个比较不错友情提示,如下:                怎么样,看起来比原始的dialog好看吧.好了,做法也许有很多,我介绍下我的做法吧, 首先,我第一个想到的就是重写dialog.自定义一个layout布局,引用shape.xml实现圆角. 在此之前,我要说明一下:在我们新建的布局文件,只要不是最外层我们引用shape就不会遇到下面这个问题,看图

android popwindow仿微信右上角弹出框,dialog底部显示

仿微信右上角弹出框 1.利用popwindow实现 2.popwindow的位置居于右上角 新建,弹出popwindow: /** 弹popwindow **/ <span style="white-space:pre"> </span>tv = (TextView) findViewById(R.id.textView1); <span style="white-space:pre"> </span>view_pop

在低于android 5.0的版本中ActionBar不显示

我从ABS切换到AppCompat与Material theme(仅适用于API21) 我的配置文件如下: <application android:theme="@style/AppStyle" <-- values folder --> <style name="AppStyle" parent="@style/AudioRecTheme"> <style name="AudioRecTheme&

Android探究2:Android 5.0下 Dialog&amp;AlertDialog 并不会影响Activity的生命周期

先给出结论:Dialog和AlertDialog并不会影响到Activity的生命周期,但会影响到Activity的优先级. 核心代码: onCreated中: Resources resources = this.getResources(); DisplayMetrics displayMetrics = resources.getDisplayMetrics(); final int widthPixels = displayMetrics.widthPixels / 2; final i

Android 6.0 - 动态权限管理的解决方案(转)

转自:http://www.cnblogs.com/dubo-/p/6018262.html Android 6.0 - 动态权限管理的解决方案 转载请标注 Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了用户体验, 同时也为程序员带来新的负担. 动态权限管理就是这样, 一方面让用户更加容易的控制自己的隐私, 一方面需要重新适配应用权限. 时代总是不断发展, 程序总是以人为本, 让我们为应用添加动态权限管理吧! 这里提供了一个非常不错的解决方案, 提供源码, 项目可以直