当前位置: 首页 > news >正文

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折叠屏适配(权宜之计)

现在折叠屏手机出了也有一段时间了&#xff0c;但是除了大厂app&#xff0c;其他app适配折叠屏还是比较少&#xff0c;如果真的想做好折叠屏完全适配&#xff0c;那这个文章可能并不适合&#xff0c;这里只是一个简单适配的思路。 如果原先你的app已经适配了平板&#xff0c;那…...

Spark是什么?Flink和Spark区别

Spark是什么&#xff1f;Flink和Spark区别 一、Spark二、Spark和Flink区别三、总结 一、Spark Apache Spark 是一个开源的大数据处理框架&#xff0c;主要用于大规模数据处理和分析。它支持多种数据处理模式&#xff0c;包括批处理、流处理、SQL 查询、机器学习和图处理等。 核…...

Cocos Creator 3.8 修改纹理像素值

修改的代码&#xff1a; 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 介绍 在目前大模型主流榜单中&#xff0c;DeepSeek-V3 在开源模型中位列榜首&#xff0c;与世界上最先进的闭源模型不分伯仲。 准备工作&#xff1a; 笔者只演示实例o1 VS DeepSeek-V3两个模型&#xff0c;大家可以自行验证结果或者实验更多场景&#xff0c;同时…...

SQL左连接的两种不同情况示例和外连接示例

Oracle&#xff1b;有2个表如下&#xff1b; 执行下图选中的左连接&#xff1b; 左表10条记录&#xff0c;右表3条记录&#xff0c;结果是10条记录&#xff1b; 执行下图的左连接&#xff0c; 老师表为左表&#xff0c;学生表为右表&#xff0c;结果会显示每个老师&#xff0c…...

【渗透测试术语总结】

Top 渗透测试常用专业术语 相信大家和我一样&#xff0c;搞不清这些专业名词的区别&#xff0c;所以我来整理一下。 1. POC、EXP、Payload与Shellcode POC&#xff1a;全称 Proof of Concept &#xff0c;中文 概念验证 &#xff0c;常指一段漏洞证明的代码。 EXP&#xf…...

Unity2D初级背包设计后篇 拓展举例与不足分析

Unity2D初级背包设计中篇 MVC分层撰写(万字详解)-CSDN博客、 如果你已经搞懂了中篇&#xff0c;那么对这个背包的拓展将极为简单&#xff0c;我就在这里举个例子吧 目录 1.添加物品描述信息 2.拓展思路与不足分析 1.没有删除只有丢弃功能&#xff0c;所以可以添加垃圾桶 2.格…...

Kafka优势剖析-幂等性和事务

目录 1. 幂等性&#xff08;Idempotence&#xff09; 1.1 什么是幂等性&#xff1f; 1.2 幂等性的实现 1.2.1 生产者 ID 和序列号 1.2.2 重复消息检测 1.2.3 幂等性的优势 1.3 幂等性的配置 2. 事务支持&#xff08;Transactions&#xff09; 2.1 什么是事务支持&…...

MyBatis深入了解

目录 xml 映射文件中&#xff0c;除了常见的select、insert、update、delete 标签之外&#xff0c;还有哪些标签? Dao 接口的工作原理是什么?Dao 接口里的方法&#xff0c;参数不同时&#xff0c;方法能重载吗? MyBatis 是如何进行分页的?分页插件的原理是什么? 简述 …...

语音技术与人工智能:智能语音交互的多场景应用探索

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

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? 官方介绍&#xff1a;Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以快速搭建生产级的生成式 AI 应用。 这是个组件式框架&#xff0c;即使是非技…...

对话|企业如何构建更完善的容器供应链安全防护体系

对话&#xff5c;企业如何构建更完善的容器供应链安全防护体系 云布道师 随着云计算和 DevOps 的兴起&#xff0c;容器技术和自动化成为软件开发中的必要手段&#xff0c;软件供应链也进入了自动化及 CI/CD 阶段。然而&#xff0c;容器技术和自动化虽然提升了软件的更新速度&…...

HTML5 缩放动画(Zoom In/Out)详解

HTML5 缩放动画&#xff08;Zoom In/Out&#xff09;详解 缩放动画是一种常见的视觉效果&#xff0c;用于使网页元素逐渐放大或缩小&#xff0c;从而吸引用户的注意力。下面将介绍如何使用 CSS 和 JavaScript 实现这种动画效果。 1. 使用 CSS 实现缩放动画 可以通过 CSS 的 …...

C语言——文件IO 【文件IO和标准IO区别,操作文件IO】open,write,read,dup2,access,stat

1.思维导图 2.练习 1&#xff1a;使用C语言编写一个简易的界面&#xff0c;界面如下 1&#xff1a;标准输出流 2&#xff1a;标准错误流 3&#xff1a;文件流 要求&#xff1a;按1的时候&#xff0c;通过printf输出数据&#xff0c;按2的时候&#xff0c;通过p…...

【C++习题】22.随机链表的复制

文章目录 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09;代码&#xff1a; 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 链接&#x1f517;&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&…...

备考蓝桥杯:数据结构概念浅谈

目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量&#xff08;时间复杂度和空间复杂度&#xff09; 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…...

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法&#xff0c;以及自动化实时数据采集 mmWave Studio提供的功能完全够用了 不用去纠结用DCA1000低延迟、无GUI传数据 速度最快又保证算力无非就是就是Linux板自己写驱动做串口和UDP 做雷达产品应用也不会采用DCA1000的…...

创建型模式3.建造者模式

创建型模式 工厂方法模式&#xff08;Factory Method Pattern&#xff09;抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;建造者模式&#xff08;Builder Pattern&#xff09;原型模式&#xff08;Prototype Pattern&#xff09;单例模式&#xff08;Singleto…...

【集成学习】Boosting算法详解

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

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 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

高危文件识别的常用算法:原理、应用与企业场景

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

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

GO协程(Goroutine)问题总结

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

CSS3相关知识点

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

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

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