AndroidAutoSize icon indicating copy to clipboard operation
AndroidAutoSize copied to clipboard

横屏以高基准下,dialog高度异常

Open SpannerBear opened this issue 5 years ago • 11 comments

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

Screenshot_2020-10-12-14-26-53-684_com klzz vipthink offline

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:

SpannerBear avatar Oct 12 '20 06:10 SpannerBear

不太明白,你这个是怎么解决的?

Moyuchen avatar Nov 06 '20 09:11 Moyuchen

横竖屏切换后,发现context的window密度发生了很大变化,导致内容变大了很多

qtybpg avatar Nov 06 '20 09:11 qtybpg

不太明白,你这个是怎么解决的?

其实没解决,只是调用了cancelAdapt把全局的适配都取消了,然后这时再创建出来的view就变好了,其实用注释那里的方法应该比较好

SpannerBear avatar Nov 10 '20 10:11 SpannerBear

的确是这样的,横竖屏切换以后,通过看项目的代码,可以项目里的autosize打断点看见,横竖屏切换后,项目回到前台,app的window的屏幕密度变大了,你可以在软件进入后台时切换回竖屏,进入前台时又回到横屏来解决

qtybpg avatar Nov 10 '20 10:11 qtybpg

横竖屏切换后,发现context的window密度发生了很大变化,导致内容变大了很多

你应该是没有看到AutoSize横竖屏切换的使用问题,去文档找找看。然后用注释的方法拷贝一个Resources出来进行单独的cancelAdapt(),我上面AutoSizeCompat.cancelAdapt()是取消了全局适配,你没有处理横竖屏问题所以没有被重新适配

SpannerBear avatar Nov 10 '20 10:11 SpannerBear

的确是这样的,横竖屏切换以后,通过看项目的代码,可以项目里的autosize打断点看见,横竖屏切换后,项目回到前台,app的window的屏幕密度变大了,你可以在软件进入后台时切换回竖屏,进入前台时又回到横屏来解决

嗯?我对比了几次都看到是一样的,我再试试看。。

SpannerBear avatar Nov 10 '20 10:11 SpannerBear

的确是这样的,横竖屏切换以后,通过看项目的代码,可以项目里的autosize打断点看见,横竖屏切换后,项目回到前台,app的window的屏幕密度变大了,你可以在软件进入后台时切换回竖屏,进入前台时又回到横屏来解决

后来发现切换到后台回到前台之后AutoSize好像重新初始化了一遍,一些数据初始化成了竖屏尺寸数据,但应用页面显示是横屏的,因此尺寸变大,目前的解决方案是在getResource里面对autozize的横竖屏尺寸修改成正确的数值

SpannerBear avatar Dec 10 '20 08:12 SpannerBear

https://blog.csdn.net/luguo1994/article/details/113373191

gggcccwww avatar Feb 25 '21 09:02 gggcccwww

https://github.com/JessYanCoding/AndroidAutoSize/blob/master/demo/src/main/java/me/jessyan/autosize/demo/BaseApplication.java#L91

JessYanCoding avatar Jul 06 '21 07:07 JessYanCoding

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

Screenshot_2020-10-12-14-26-53-684_com klzz vipthink offline

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是否有办法修改呢

wuyihao99 avatar Aug 30 '23 08:08 wuyihao99

如果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:

弹窗布局代码:

qtybpg avatar Oct 09 '23 01:10 qtybpg