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)是一种通过结合多个模型的预测结果来提高整体预测性能的技术。相比于单个模型…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
