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

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

相关推荐
极客先躯15 小时前
高级java每日一道面试题-2026年02月09日-实战篇[Docker]-Docker 容器有哪些安全风险?如何缓解?
java·运维·网络·安全·docker·容器
_Aaron___15 小时前
MyBatis 动态排序别乱用 ${}:ORDER BY 的安全写法
java·spring·mybatis
摇滚侠15 小时前
SpringMVC 入门到实战 HttpMessageConverter 65-74
java·后端·spring·intellij-idea
逢君学术论文AI写作15 小时前
Java第24课:会话技术CookieSession
java·开发语言
小小编程路15 小时前
字符串转数字时,可能会遇到哪些问题?
java·开发语言·算法
许彰午15 小时前
责任链模式实战——同一个框架里的两种链
java·开发语言·责任链模式
寻道码路15 小时前
LangChain4j Java AI 应用开发实战(十四):手写 RAG 全流程 - 深入理解每个环节
java·开发语言·人工智能·ai
云烟成雨TD15 小时前
Agent Scope Java 2.x 系列【1】核心架构
java·人工智能·agent
愛~杦辷个訾15 小时前
Java Springboot使用阿里云oss对图片进行等质量压缩,转换成webp格式的压缩图。
java·spring boot·阿里云·oss
故渊at15 小时前
第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战
android·架构·宏内核·微内核·fuchsia·ipc 性能博弈