AndroidAutoSize
AndroidAutoSize copied to clipboard
横屏以高基准下,dialog高度异常
Environment
- [x] Autosize Version: 1.2.0
- [x] Target Android Version: 任意
- [x] Device Model: 任意
- [x] Device Resolution: 任意
- [x] Design Size On AndroidManifest: 1335*768
Bug Description:
我们应用是横屏运行,在activity设置AutoSize适配以高768为基准,显示一个dialog, dialog高度一旦超出某个数值,其余内容将被裁剪掉,无法显示, 需要手动对dialog的window进行写死设置,但这个方法对一些需要根据内容自动适配高度的dialog来说有很大问题。 我在某一个回答下看到一个类似问题的方案,用来替换dialog的context:
public class AutoSizeContextWrapper extends android.content.ContextWrapper {
private Resources mResources;
public AutoSizeContextWrapper(Context base) {
super(base);
//这里调用 AutoSizeCompat.autoConvertDensity()也会出现UI放大
cancelAdapt();
}
private synchronized void cancelAdapt() {
Resources oldResources = super.getResources();
mResources = new Resources(oldResources.getAssets(), oldResources.getDisplayMetrics(), oldResources.getConfiguration());
AutoSizeCompat.cancelAdapt(mResources);
//下面这种使用拷贝修改的cancelAdapt()避免全局Resource适配取消,这种方法也会出现UI放大
/*DisplayMetrics oldDisplayMetrics = oldResources.getDisplayMetrics();
DisplayMetrics displayMetrics = new DisplayMetrics();
displayMetrics.density = oldDisplayMetrics.density;
displayMetrics.densityDpi = oldDisplayMetrics.densityDpi;
displayMetrics.heightPixels = oldDisplayMetrics.heightPixels;
displayMetrics.scaledDensity = oldDisplayMetrics.scaledDensity;
displayMetrics.widthPixels = oldDisplayMetrics.widthPixels;
displayMetrics.xdpi = oldDisplayMetrics.xdpi;
displayMetrics.ydpi = oldDisplayMetrics.ydpi;
Configuration configuration = new Configuration(oldResources.getConfiguration());
mResources = new Resources(oldResources.getAssets(),displayMetrics , configuration);
cancelAdapt(mResources);*/
}
@Override
public Resources getResources() {
return mResources;
}
}
使用这个方案之后dialog能够正常显示完全和自动适配高度了,dialog内的UI也没有真的失去适配, 不过后来发现在华为android10下出现切换到其他app之后再返回打开dialog,dialog尺寸会真的失去适配,尺寸放大了很多。 (复现路径->打开app到稳定页面,切后台->回前台->切后台->回前台->打开dialog,固定在第二次切后台回来后失去适配)
请问除了这个方案之外还有其他解决方法吗?
Screenshot

Related Code:
弹窗布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:orientation="vertical">
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具1"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具2"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具3"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具4"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具5"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具6"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具7"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具8"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具9"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具10"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具11"
android:layout_marginTop="20dp"
android:textSize="19dp" />
<TextView
android:layout_width="300dp"
android:layout_height="wrap_content"
android:text="玩玩具12"
android:layout_marginTop="20dp"
android:textSize="19dp" />
</LinearLayout>
Others:
不太明白,你这个是怎么解决的?
横竖屏切换后,发现context的window密度发生了很大变化,导致内容变大了很多
不太明白,你这个是怎么解决的?
其实没解决,只是调用了cancelAdapt把全局的适配都取消了,然后这时再创建出来的view就变好了,其实用注释那里的方法应该比较好
的确是这样的,横竖屏切换以后,通过看项目的代码,可以项目里的autosize打断点看见,横竖屏切换后,项目回到前台,app的window的屏幕密度变大了,你可以在软件进入后台时切换回竖屏,进入前台时又回到横屏来解决
横竖屏切换后,发现context的window密度发生了很大变化,导致内容变大了很多
你应该是没有看到AutoSize横竖屏切换的使用问题,去文档找找看。然后用注释的方法拷贝一个Resources出来进行单独的cancelAdapt(),我上面AutoSizeCompat.cancelAdapt()是取消了全局适配,你没有处理横竖屏问题所以没有被重新适配
的确是这样的,横竖屏切换以后,通过看项目的代码,可以项目里的autosize打断点看见,横竖屏切换后,项目回到前台,app的window的屏幕密度变大了,你可以在软件进入后台时切换回竖屏,进入前台时又回到横屏来解决
嗯?我对比了几次都看到是一样的,我再试试看。。
的确是这样的,横竖屏切换以后,通过看项目的代码,可以项目里的autosize打断点看见,横竖屏切换后,项目回到前台,app的window的屏幕密度变大了,你可以在软件进入后台时切换回竖屏,进入前台时又回到横屏来解决
后来发现切换到后台回到前台之后AutoSize好像重新初始化了一遍,一些数据初始化成了竖屏尺寸数据,但应用页面显示是横屏的,因此尺寸变大,目前的解决方案是在getResource里面对autozize的横竖屏尺寸修改成正确的数值
https://blog.csdn.net/luguo1994/article/details/113373191
https://github.com/JessYanCoding/AndroidAutoSize/blob/master/demo/src/main/java/me/jessyan/autosize/demo/BaseApplication.java#L91
Environment
- [x] Autosize Version: 1.2.0
- [x] Target Android Version: 任意
- [x] Device Model: 任意
- [x] Device Resolution: 任意
- [x] Design Size On AndroidManifest: 1335*768
Bug Description:
我们应用是横屏运行,在activity设置AutoSize适配以高768为基准,显示一个dialog, dialog高度一旦超出某个数值,其余内容将被裁剪掉,无法显示, 需要手动对dialog的window进行写死设置,但这个方法对一些需要根据内容自动适配高度的dialog来说有很大问题。 我在某一个回答下看到一个类似问题的方案,用来替换dialog的context:
public class AutoSizeContextWrapper extends android.content.ContextWrapper { private Resources mResources; public AutoSizeContextWrapper(Context base) { super(base); //这里调用 AutoSizeCompat.autoConvertDensity()也会出现UI放大 cancelAdapt(); } private synchronized void cancelAdapt() { Resources oldResources = super.getResources(); mResources = new Resources(oldResources.getAssets(), oldResources.getDisplayMetrics(), oldResources.getConfiguration()); AutoSizeCompat.cancelAdapt(mResources); //下面这种使用拷贝修改的cancelAdapt()避免全局Resource适配取消,这种方法也会出现UI放大 /*DisplayMetrics oldDisplayMetrics = oldResources.getDisplayMetrics(); DisplayMetrics displayMetrics = new DisplayMetrics(); displayMetrics.density = oldDisplayMetrics.density; displayMetrics.densityDpi = oldDisplayMetrics.densityDpi; displayMetrics.heightPixels = oldDisplayMetrics.heightPixels; displayMetrics.scaledDensity = oldDisplayMetrics.scaledDensity; displayMetrics.widthPixels = oldDisplayMetrics.widthPixels; displayMetrics.xdpi = oldDisplayMetrics.xdpi; displayMetrics.ydpi = oldDisplayMetrics.ydpi; Configuration configuration = new Configuration(oldResources.getConfiguration()); mResources = new Resources(oldResources.getAssets(),displayMetrics , configuration); cancelAdapt(mResources);*/ } @Override public Resources getResources() { return mResources; } }使用这个方案之后dialog能够正常显示完全和自动适配高度了,dialog内的UI也没有真的失去适配, 不过后来发现在华为android10下出现切换到其他app之后再返回打开dialog,dialog尺寸会真的失去适配,尺寸放大了很多。 (复现路径->打开app到稳定页面,切后台->回前台->切后台->回前台->打开dialog,固定在第二次切后台回来后失去适配)
请问除了这个方案之外还有其他解决方法吗?
Screenshot
Related Code:
弹窗布局代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:orientation="vertical"> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具1" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具2" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具3" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具4" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具5" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具6" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具7" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具8" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具9" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具10" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具11" android:layout_marginTop="20dp" android:textSize="19dp" /> <TextView android:layout_width="300dp" android:layout_height="wrap_content" android:text="玩玩具12" android:layout_marginTop="20dp" android:textSize="19dp" /> </LinearLayout>Others:
DialogFragment是否有办法修改呢
如果dialogfragment的容器activity涉及到横竖屏切换的,建议实现库的取消自适应方法,沿用竖屏界面设置的显示密度,看代码可以发现AutoSize设置显示密度是每次onstart都会调用的
------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年8月30日(星期三) 下午4:14 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [JessYanCoding/AndroidAutoSize] 横屏以高基准下,dialog高度异常 (#320)
Environment
Autosize Version: 1.2.0
Target Android Version: 任意
Device Model: 任意
Device Resolution: 任意
Design Size On AndroidManifest: 1335*768
Bug Description:
我们应用是横屏运行,在activity设置AutoSize适配以高768为基准,显示一个dialog, dialog高度一旦超出某个数值,其余内容将被裁剪掉,无法显示, 需要手动对dialog的window进行写死设置,但这个方法对一些需要根据内容自动适配高度的dialog来说有很大问题。 我在某一个回答下看到一个类似问题的方案,用来替换dialog的context: public class AutoSizeContextWrapper extends android.content.ContextWrapper { private Resources mResources; public AutoSizeContextWrapper(Context base) { super(base); //这里调用 AutoSizeCompat.autoConvertDensity()也会出现UI放大 cancelAdapt(); } private synchronized void cancelAdapt() { Resources oldResources = super.getResources(); mResources = new Resources(oldResources.getAssets(), oldResources.getDisplayMetrics(), oldResources.getConfiguration()); AutoSizeCompat.cancelAdapt(mResources); //下面这种使用拷贝修改的cancelAdapt()避免全局Resource适配取消,这种方法也会出现UI放大 /DisplayMetrics oldDisplayMetrics = oldResources.getDisplayMetrics(); DisplayMetrics displayMetrics = new DisplayMetrics(); displayMetrics.density = oldDisplayMetrics.density; displayMetrics.densityDpi = oldDisplayMetrics.densityDpi; displayMetrics.heightPixels = oldDisplayMetrics.heightPixels; displayMetrics.scaledDensity = oldDisplayMetrics.scaledDensity; displayMetrics.widthPixels = oldDisplayMetrics.widthPixels; displayMetrics.xdpi = oldDisplayMetrics.xdpi; displayMetrics.ydpi = oldDisplayMetrics.ydpi; Configuration configuration = new Configuration(oldResources.getConfiguration()); mResources = new Resources(oldResources.getAssets(),displayMetrics , configuration); cancelAdapt(mResources);/ } @Override public Resources getResources() { return mResources; } }
使用这个方案之后dialog能够正常显示完全和自动适配高度了,dialog内的UI也没有真的失去适配, 不过后来发现在华为android10下出现切换到其他app之后再返回打开dialog,dialog尺寸会真的失去适配,尺寸放大了很多。 (复现路径->打开app到稳定页面,切后台->回前台->切后台->回前台->打开dialog,固定在第二次切后台回来后失去适配)
请问除了这个方案之外还有其他解决方法吗?
Screenshot
Related Code:
弹窗布局代码: