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是同样的内容,根据平板还是手机去取对应的值就可以。

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

相关推荐
Wang's Blog3 分钟前
Java 项目实战: 外卖平台优化-YApi接口管理平台与文档导入导出
java·开发语言·yapi
专业程序开发源8 分钟前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
vx_Biye_Design24 分钟前
springboot一站式旅游管理平台81037-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·课程设计·express·旅游
写后端的胖头鱼29 分钟前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
嵌入式学习菌33 分钟前
ESP32 ModbusTCP 分片缓存
java·后端·spring
vx_Biye_Design34 分钟前
springboot宠物寄养服务预约与监管系统82684-计算机课程设计、毕业设计
java·vue.js·spring boot·elasticsearch·课程设计·express·宠物
程序员小杰@40 分钟前
Spring Boot 常用注解分类速记
java·spring boot·后端
vx_Biye_Design1 小时前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
吴声子夜歌1 小时前
Nginx应用与运维——Nginx日志管理
java·运维·nginx