Android折叠屏适配(权宜之计)
现在折叠屏手机出了也有一段时间了,但是除了大厂app,其他app适配折叠屏还是比较少,如果真的想做好折叠屏完全适配,那这个文章可能并不适合,这里只是一个简单适配的思路。
如果原先你的app已经适配了平板,那其实折叠屏和平板差不多,估计你调整一下应用,让活动在折叠、展开时不要重启应该就大差不差了,或者折叠、展开时让app重启,这时会根据屏幕大小选择合适的布局,其实也是一种选择,约摸着也不用花太多功夫。
但是如果好死不死,原先没适配平板,但是老板脑子一热,想适配一下折叠屏,那我这里提供一个权宜之计。(这个是不推荐的做法,如果有能力最好还是照android官方文档和一些对应厂商的开发文档做一下适配)
思路也很简单:监听折叠状态,改变对应布局
首先第一步导依赖,参考官方的文档
WindowManager | Jetpack | Android Developers
在app的build.gradle添加依赖
dependencies {implementation "androidx.window:window:1.3.0"implementation "androidx.window:window-java:1.3.0"
}
第二步,在需要根据折叠状态改变布局的活动,设置其改变不重启,AndroidManifest.xml里面找到对应活动,改一下它的configChanegs,这个应该都会
<activityandroid:name=".activities.MediaPlayerActivity"android:configChanges="keyboardHidden|orientation|screenSize|uiMode| locale|layoutDirection|screenLayout|smallestScreenSize"android:launchMode="singleTop"android:hardwareAccelerated="true"android:screenOrientation="portrait" />
加了screenLayout和smallestScreenSize这两个,后面折叠状态改变时在对应活动的onConfigurationChanged变更布局和一些其他操作
下面说一下如何监听,参考官方文档
让应用具备折叠感知能力 | Jetpack Compose | Android Developers
在活动onCreate时添加折叠状态监听器
WindowInfoTracker windowInfoTracker = WindowInfoTracker.getOrCreate(this);
WindowInfoTrackerCallbackAdapter windowInfoTrackerCallbackAdapter = new WindowInfoTrackerCallbackAdapter(windowInfoTracker);
//添加折叠屏切换监听
windowInfoTrackerCallbackAdapter.addWindowLayoutInfoListener(this, Runnable::run,windowLayoutInfo -> {runOnUiThread(() -> {List<DisplayFeature> displayFeatures = windowLayoutInfo.getDisplayFeatures();if(displayFeatures.size() == 0){ //单屏状态(折叠) 或者非折叠屏手机Log.d(TAG,"单屏/非折叠");//现在是折叠状态,将折叠状态设置到全局变量,onConfigurationChanged使用setFoldState(0); //明白意义就行,需要自己实现相关逻辑}//展开状态 可能是半折/展开for(DisplayFeature feature : displayFeatures){if(feature instanceof FoldingFeature) {//半折叠if ( ((FoldingFeature) feature).getState() == FoldingFeature.State.HALF_OPENED) {Log.d(TAG, "半折叠");//现在是半折叠状态,将折叠状态设置到全局变量,onConfigurationChanged使用setFoldState(1);}//平的(全展开)else if ( ((FoldingFeature) feature).getState() == FoldingFeature.State.FLAT) {Log.d(TAG, "完全展开");//现在是完全展开状态,将折叠状态设置到全局变量,onConfigurationChanged使用setFoldState(2);}}}});
});
onConfigurationChanged中根据折叠状态实现业务逻辑
@Override
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);....int foldState = getFoldState(); //获取折叠状态switch(foldState){ //根据折叠状态实现对应逻辑case 0:.....}
}
除此之外,在设备不是折叠屏时我们可以不添加监听,这个判断方法根据不同厂商也会有不同,目前我只验了荣耀magic V2,其他就不确定行不行了。
建议这个判断在应用的application.java里面做,判断后写到全局变量方便后续使用
//判断是否折叠屏手机
Log.d(TAG, "手机品牌= " + Build.MANUFACTURER);
// 华为 "Huawei" 荣耀 "HONOR" 华为NOVA "nova" 小米 "xiaomi" vivo "vivo"
// 魅族 "Meizu" 索尼 "sony" 三星 "samsung" OPPO "OPPO" 乐视 "letv"
// 一加 "OnePlus" LG "lg" 锤子 "smartisan" 联想 "lenovo" HTC "htc"if (Build.MANUFACTURER.equalsIgnoreCase("HONOR") //荣耀折叠屏&& getPackageManager() != null&& getPackageManager().hasSystemFeature("com.hihonor.hardware.sensor.posture")) {sIsFoldableDevice = true; //全局变量,是否为折叠屏手机,设置true
}
else if (Build.MANUFACTURER.equalsIgnoreCase("VIVO")){ //vivo折叠屏Class<?> c= null;try {c = Class.forName("android.util.FtDeviceInfo");Method m = c.getMethod("getDeviceType");Object dType = m.invoke(c);sIsFoldableDevice = "foldable".equals(dType); } catch (Exception e) {Log.d(TAG,e.toString());}
}
else if(Build.MANUFACTURER.equalsIgnoreCase("xiaomi")){ //小米折叠屏Class c = null;try {c = Class.forName("android.os.SystemProperties");Method m = c.getMethod("getInt",String.class, int.class);int type = (int) m.invoke(c,"persist.sys.muiltdisplay_type", 0);sIsFoldableDevice = (type == 2);} catch (Exception e) {Log.d(TAG,e.toString());}
}
else if (Build.MANUFACTURER.equalsIgnoreCase("OPPO") ){ //oppo折叠屏try {Class<?> cls = Class.forName("com.oplus.content.OplusFeatureConfigManager");Method instance = cls.getMethod("getInstance");Object configManager = instance.invoke(null);Method hasFeature = cls.getDeclaredMethod("hasFeature", String.class);Object object = hasFeature.invoke(configManager, "oplus.hardware.type.fold");if (object instanceof Boolean) {sIsFoldableDevice = (boolean) object;}} catch (Exception e){Log.d(TAG,e.toString());}
}
else if (Build.MANUFACTURER.equalsIgnoreCase("HUAWEI") ) { //华为折叠屏sIsFoldableDevice = getPackageManager().hasSystemFeature( "com.huawei.hardware.sensor.posture");
else { //其他厂商DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);Display[] displays = displayManager.getDisplays();for (Display display : displays) {if (display.getName().contains("Foldable")) {// 判断为折叠屏sIsFoldableDevice = true;break;}}
}
Log.d(TAG, sIsFoldableDevice + "");
相关文章:
Android折叠屏适配(权宜之计)
现在折叠屏手机出了也有一段时间了,但是除了大厂app,其他app适配折叠屏还是比较少,如果真的想做好折叠屏完全适配,那这个文章可能并不适合,这里只是一个简单适配的思路。 如果原先你的app已经适配了平板,那…...
Spark是什么?Flink和Spark区别
Spark是什么?Flink和Spark区别 一、Spark二、Spark和Flink区别三、总结 一、Spark Apache Spark 是一个开源的大数据处理框架,主要用于大规模数据处理和分析。它支持多种数据处理模式,包括批处理、流处理、SQL 查询、机器学习和图处理等。 核…...
Cocos Creator 3.8 修改纹理像素值
修改的代码: import { _decorator, Component, RenderTexture, Sprite, Texture2D, ImageAsset, SpriteFrame, Vec2, gfx, director, log, math, v2 } from cc;const { ccclass, property } _decorator;ccclass(GradientTransparency) export class GradientTrans…...

如何评价deepseek-V3 VS OpenAI o1 自然语言处理成Sql的能力
DeepSeek-V3 介绍 在目前大模型主流榜单中,DeepSeek-V3 在开源模型中位列榜首,与世界上最先进的闭源模型不分伯仲。 准备工作: 笔者只演示实例o1 VS DeepSeek-V3两个模型,大家可以自行验证结果或者实验更多场景,同时…...

SQL左连接的两种不同情况示例和外连接示例
Oracle;有2个表如下; 执行下图选中的左连接; 左表10条记录,右表3条记录,结果是10条记录; 执行下图的左连接, 老师表为左表,学生表为右表,结果会显示每个老师,…...
【渗透测试术语总结】
Top 渗透测试常用专业术语 相信大家和我一样,搞不清这些专业名词的区别,所以我来整理一下。 1. POC、EXP、Payload与Shellcode POC:全称 Proof of Concept ,中文 概念验证 ,常指一段漏洞证明的代码。 EXP…...

Unity2D初级背包设计后篇 拓展举例与不足分析
Unity2D初级背包设计中篇 MVC分层撰写(万字详解)-CSDN博客、 如果你已经搞懂了中篇,那么对这个背包的拓展将极为简单,我就在这里举个例子吧 目录 1.添加物品描述信息 2.拓展思路与不足分析 1.没有删除只有丢弃功能,所以可以添加垃圾桶 2.格…...
Kafka优势剖析-幂等性和事务
目录 1. 幂等性(Idempotence) 1.1 什么是幂等性? 1.2 幂等性的实现 1.2.1 生产者 ID 和序列号 1.2.2 重复消息检测 1.2.3 幂等性的优势 1.3 幂等性的配置 2. 事务支持(Transactions) 2.1 什么是事务支持&…...
MyBatis深入了解
目录 xml 映射文件中,除了常见的select、insert、update、delete 标签之外,还有哪些标签? Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗? MyBatis 是如何进行分页的?分页插件的原理是什么? 简述 …...

语音技术与人工智能:智能语音交互的多场景应用探索
引言 近年来,智能语音技术取得了飞速发展,逐渐渗透到日常生活和各行各业中。从语音助手到智能家居控制,再到企业客服和教育辅导,语音交互正以前所未有的速度改变着人机沟通的方式。这一变革背后,人工智能技术无疑是关键…...

Openwrt @ rk3568平台 固件编译实践(二)- ledeWRT版本
目录 ledeWRT介绍固件编译下载代码修改feed源更新并安装编译第三方软件包制作用于eMMC烧写的rootfs基于lede发行版验证烧写rk3568.img, LEDE wrt启动成功refhttps://blog.csdn.net/zc21463071/article/details/106751361介绍rk3568平台下, lede 大神版 openwrt固件的下载、编译…...
Windows下调试Dify相关组件(1)--前端Web
1. 什么是Dify? 官方介绍:Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。 这是个组件式框架,即使是非技…...

对话|企业如何构建更完善的容器供应链安全防护体系
对话|企业如何构建更完善的容器供应链安全防护体系 云布道师 随着云计算和 DevOps 的兴起,容器技术和自动化成为软件开发中的必要手段,软件供应链也进入了自动化及 CI/CD 阶段。然而,容器技术和自动化虽然提升了软件的更新速度&…...
HTML5 缩放动画(Zoom In/Out)详解
HTML5 缩放动画(Zoom In/Out)详解 缩放动画是一种常见的视觉效果,用于使网页元素逐渐放大或缩小,从而吸引用户的注意力。下面将介绍如何使用 CSS 和 JavaScript 实现这种动画效果。 1. 使用 CSS 实现缩放动画 可以通过 CSS 的 …...

C语言——文件IO 【文件IO和标准IO区别,操作文件IO】open,write,read,dup2,access,stat
1.思维导图 2.练习 1:使用C语言编写一个简易的界面,界面如下 1:标准输出流 2:标准错误流 3:文件流 要求:按1的时候,通过printf输出数据,按2的时候,通过p…...

【C++习题】22.随机链表的复制
文章目录 题目:138. 随机链表的复制 - 力扣(LeetCode)代码: 题目:138. 随机链表的复制 - 力扣(LeetCode) 链接🔗:138. 随机链表的复制 - 力扣(LeetCode&…...

备考蓝桥杯:数据结构概念浅谈
目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量(时间复杂度和空间复杂度) 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…...

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集
【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集 mmWave Studio提供的功能完全够用了 不用去纠结用DCA1000低延迟、无GUI传数据 速度最快又保证算力无非就是就是Linux板自己写驱动做串口和UDP 做雷达产品应用也不会采用DCA1000的…...
创建型模式3.建造者模式
创建型模式 工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract Factory Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern)单例模式(Singleto…...

【集成学习】Boosting算法详解
文章目录 1. 集成学习概述2. Boosting算法详解3. Gradient Boosting算法详解3.1 基本思想3.2 公式推导 4. Python实现 1. 集成学习概述 集成学习(Ensemble Learning)是一种通过结合多个模型的预测结果来提高整体预测性能的技术。相比于单个模型…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...