JessYanCoding / AndroidAutoSize

🔥 A low-cost Android screen adaptation solution (今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案).
Apache License 2.0
13.47k stars 1.96k forks source link

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

Open SpannerBear opened 3 years ago

SpannerBear commented 3 years ago

Environment

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:

Moyuchen commented 3 years ago

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

qtybpg commented 3 years ago

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

SpannerBear commented 3 years ago

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

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

qtybpg commented 3 years ago

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

SpannerBear commented 3 years ago

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

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

SpannerBear commented 3 years ago

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

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

SpannerBear commented 3 years ago

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

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

gggcccwww commented 3 years ago

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

JessYanCoding commented 3 years ago

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

wuyihao99 commented 1 year ago

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

qtybpg commented 12 months ago

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

弹窗布局代码: <?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" @.***: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是否有办法修改呢

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>