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

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

相关推荐
_BugMan6 小时前
【IDEA】干活?一个IDEA即可,集成开发平台打造攻略
java·ide·intellij-idea
YA3336 小时前
java设计模式二、工厂
java·开发语言·设计模式
金色天际线-7 小时前
Nginx 优化与防盗链配置指南
java·后端·spring
我爱挣钱我也要早睡!7 小时前
Java 复习笔记
java·开发语言·笔记
Yang-Never9 小时前
Kotlin协程 -> Job.join() 完整流程图与核心源码分析
android·开发语言·kotlin·android studio
AD钙奶-lalala9 小时前
Mac OS上搭建 http server
java
XeonYu10 小时前
Kotlin 协程之 突破 Flow 限制:Channel 与 Flow 的结合之道
kotlin·coroutine·channelflow·callbackflow·receiveasflow·consumeasflow
皮皮林55113 小时前
SpringBoot 全局/局部双模式 Gzip 压缩实战:14MB GeoJSON 秒变 3MB
java·spring boot
weixin_4569042714 小时前
Spring Boot 用户管理系统
java·spring boot·后端