Android :如何快速让布局适配手机和平板?

目录

  1. 问题是什么
  2. 解决方法?
  3. 原因是什么?
  4. 还有其他需要适配?

一、问题是什么?

我们先截图看看问题:

这是平板展示的效果,可以看到,内容太大了,可见范围太小,这是现在的问题

这是手机的展示的效果,挺好的

我们想要平板也这样


二、解决方法

(1)activity

kotlin 复制代码
abstract class BaseActivity<VB : ViewBinding, VM : BaseViewModel> : BaseFrameActivity<VB, VM>(),CustomAdapt {



    override fun isBaseOnWidth() = !PhoneUtils.isPad()

    override fun getSizeInDp(): Float {
        return if (!PhoneUtils.isPad()) 360f else 720f
    }
}

(2)fragment

kotlin 复制代码
abstract class BaseFragment<VB : ViewBinding, VM : BaseViewModel> : BaseFrameFragment<VB, VM>(),CustomAdapt{


   override fun isBaseOnWidth() = !PhoneUtils.isPad()

    override fun getSizeInDp(): Float {
        return if (!PhoneUtils.isPad()) 360f else 720f
    }
}

(3)application(可选)

kotlin 复制代码
open class BaseApplication : MultiDexApplication() {
override fun onCreate() {
    super.onCreate()
    //屏幕适配
    AutoSize.initCompatMultiProcess(this)
    AutoSizeConfig.getInstance().setCustomFragment(true)
    }
}

三、原理

但为什么360f在平板上ui变得很大呢?而在手机就正常呢?

3.1 CustomAdapt

android-autosize是一个屏幕适配库,CustomAdapt接口允许你为特定页面(Activity/Fragment)​​定制专属的屏幕适配方案​​,不同于全局设置。

1. isBaseOnWidth()作用:
  • ​决定适配基准​​:告诉库使用宽度还是高度作为适配基准

  • 返回 true:以​​宽度​​为基准(常见于手机竖屏)

  • 返回 false:以​​高度​​为基准(常见于平板横屏)

  • 如果是平板(isPad())就返回 false(以高度为基准),否则返回 true(以宽度为基准)

2. getSizeInDp()作用:
  • ​设置设计稿尺寸​​:告诉库你设计稿的基准尺寸

    • 手机:使用 360dp(常见手机设计稿宽度)

    • 平板:使用 720dp(常见平板设计稿高度)

为什么平板要用高度基准?
  1. ​平板横屏特性​​:

    • 宽度变化范围大(10寸到13寸差30%)

    • 高度变化范围小(所有平板横屏高度≈手机竖屏高度)

​核心约束​​ : 宽度是刚性约束 (内容不能超宽) | 高度是刚性约束 (分区比例不能崩) |

简单来说,其实根本原因在于 autosize的底层算法,对于基准为宽度和高度的逻辑不同。​


四、除了配置这些,还有其他需要适配?

第一点:在写一个宽度的时候,尽量使用0dp,然后设置weight,而不是写死宽度,不然就会很小。

第二点:一些列表,可以考虑在平板的时候排列三行,非平板默认两行,把空间给利用起来。


五、还有更加简单的方法

kotlin 复制代码
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        AutoSizeConfig.getInstance().setBaseOnWidth(!PhoneUtils.isPad())
    }
}
ini 复制代码
<meta-data
    android:name="design_width_in_dp"
    android:value="360" />

<meta-data
    android:name="design_height_in_dp"
    android:value="720"/>

直接这样就行,统一设置。

可以理解为

kotlin 复制代码
 override fun getSizeInDp(): Float {
     return if (!PhoneUtils.isPad()) 360f else 720f
 }

getSizeInDp和meta-data是同样的内容,根据平板还是手机去取对应的值就可以。

好了,这篇文章就到这里,我们下篇文章见。

相关推荐
码兄科技6 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研7 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe187 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_7 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff8 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯8 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地9 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我123459 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
万亿少女的梦16810 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue