用Jetpack Compose打造InxLocker设置界面:Material 3与安装器选择列表实战
【免费下载链接】InxLockerXposed-based Installer Locker for Android (Powered by YukiHookAPI)项目地址https://gitcode.com/gh_mirrors/in/InxLocker点击查看免费下载如果你正在学习Jetpack Compose想找一个真实、完整的设置界面案例InxLocker 是很好的起点。这是一个基于 Xposed 的 Android 安装器锁定模块Installer Locker它的整个设置界面用Jetpack Compose Material 3构建包含状态卡片、开关分组和一个完整的安装器选择列表。下面带你拆解它的主题配置、卡片式布局与底部选择列表的实现思路新手照着学即可上手。InxLocker 是什么一个 Xposed 安装器锁定模块 InxLocker 的核心功能是拦截并转发Android 系统的应用安装与卸载请求将其重定向到你指定的安装器 App。主要能力包括安装重定向拦截 APK 安装请求自动调起你选择的安装器卸载重定向将卸载请求交给指定的卸载器处理会话安装拦截Session Install拦截 Android 11 的CONFIRM_INSTALL强制组件调用长按列表项锁定特定 Activity 组件解决部分应用硬编码安装器的问题隐藏桌面图标、调试日志开关等辅助功能对普通用户来说它特别适合深度定制系统的设备对开发者来说它更是一个纯 Compose 单 Activity 设置页的教科书级范例——没有 XML 布局全部界面由声明式代码生成。技术栈一览Compose BOM 与 Material 3 依赖InxLocker 使用 Version Catalog 统一管理版本核心依赖定义在 gradle/libs.versions.tomlactivityCompose 1.13.0提供setContent桥接composeBom 2026.03.01Compose BOM 统一管理 UI、Foundation、Animation 版本material3Material 3 组件库Card、Switch、ModalBottomSheet 等模块启用方式非常简洁在 app/build.gradle.kts 中应用kotlin-compose插件并开启buildFeatures { compose true }见 第55-58行。依赖则通过 BOM 平台引入第72-76行implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.material3) 新手提示用 BOM 管理 Compose 版本可以避免ui、foundation、material3版本不一致导致的诡异编译错误。Material 3 主题配置动态取色 明暗双套色板 主题是整个界面的底色InxLocker 的主题封装在 Theme.ktval colorScheme when { dynamicColor Build.VERSION.SDK_INT Build.VERSION_CODES.S - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) darkTheme - DarkColorScheme else - LightColorScheme }三层降级策略很值得借鉴Android 12且开启动态取色时使用壁纸主题色Material You否则按系统明暗切换使用 Color.kt 中定义的两套紫色系色板Purple40/Purple80等字体样式集中在 Type.kt只覆盖了bodyLarge16sp、行高 24sp其余沿用 Material 3 默认排版入口在 MainActivity.kt 的onCreate中enableEdgeToEdge()setContent { InxLockerTheme { MainScreen() } }两行代码完成从 Activity 到 Compose 世界的切换。设置页骨架Scaffold LazyColumn 卡片式布局MainScreen 的整体结构是一个Scaffold包裹LazyColumn每个功能区块都是一个独立itemLazyColumn( contentPadding PaddingValues(16.dp), verticalArrangement Arrangement.spacedBy(16.dp) ) { item { ModuleStatusCard() } // 模块状态卡片 item { SettingsGroup(...) } // 默认安装器设置 item { /* 开关分组卡片 */ } item { InstructionCard() } // 使用说明卡片 }这种卡片堆叠 16dp 间距的布局是 Material 3 设置页的经典范式比传统 ListView 的密集列表观感更轻盈。几个细节值得注意状态卡片ModuleStatusCard 会读取模块激活状态激活时卡片背景用primaryContainer30% 透明度未激活则切换为errorContainer配 Warning 图标用颜色直接传达是否生效卡片统一设置elevation 0.dp、背景为surfaceVariant.copy(alpha 0.4f)形成扁平柔和的视觉风格所有间距、圆角、图标尺寸都引用统一的 Dimensions 设计令牌SpaceS 8.dp、SpaceL 16.dp、ListItem.M 56.dp等而不是散落魔法数字自定义组件实战设置行与开关行 界面中大量复用的两个组件位于ui/widget/目录是整个设置页的乐高积木1. 普通设置行— SettingsGroup.ktSettingsItemRow由三部分组成左侧圆角图标底primary色 10% 透明度的Box、中间标题 副标题的Column、右侧的KeyboardArrowRight箭头。整行用clickableripple()提供波纹反馈行与行之间用HorizontalDivider1dp、outline色 10% 透明度分隔。2. 开关设置行— SwitchGroup.ktSettingsSwitchRow在右侧换成了 Material 3 的Switch并有两处好设计使用toggleable(role Role.Switch)而非clickable让读屏器等无障碍服务能正确识别这是开关用remember(item.isChecked)做局部状态缓存保证开关动画流畅3. 数据载体组件的数据参数是极简的Immutabledata classSettingsItem图标、标题、副标题、点击回调和 SwitchItem增加isChecked与onCheckedChange。Immutable注解告诉 Compose 编译器该对象内容不可变可跳过无效重组这是 Compose 性能优化的基础功。4. 条件展开动画开关之间的从属关系用AnimatedVisibilityfadeIn()/fadeOut() expandVertically()/shrinkVertically()实现例如拦截卸载开启后才会展开其子选项MainActivity.kt 第407-448行。配合卡片上的animateContentSize()展开收起过程平滑无跳变。安装器选择列表ModalBottomSheet 底部弹层实战 这是全文最值得学的部分如何扫描系统里的安装器并在底部弹层里做成一个可点选、可长按的选择列表。第一步扫描系统中所有 APK 安装器getApkInstallerApps 用一个假的 APK URI构造ACTION_VIEWIntent交给packageManager.queryIntentActivities做隐式 Intent 解析val intent Intent(Intent.ACTION_VIEW).apply { setDataAndType(content://nya.apk.toUri(), application/vnd.android.package-archive) } val resolveInfos packageManager.queryIntentActivities(intent, MATCH_ALL or MATCH_DEFAULT_ONLY)然后过滤掉非导出exported的 Activity取出应用名loadLabel和图标loadIcon最后按名称排序。结果封装进 InstallerApp 并用 StableInstallerList 包裹外层remember缓存避免每次重组都重新扫描 PackageManager。第二步底部弹层列表点默认安装器行后弹出 InstallerSelectionDialogModalBottomSheet( onDismissRequest onDismiss, sheetState rememberModalBottomSheetState(skipPartiallyExpanded true) ) { LazyColumn( contentPadding PaddingValues(16.dp), verticalArrangement Arrangement.spacedBy(8.dp) ) { item { InstallerItem(...) } // 第一项固定为系统默认 itemsIndexed(installerList.list) { _, app - InstallerItem(...) } } }要点拆解skipPartiallyExpanded true让弹层直接展开到fillMaxHeight(0.85f)的高度避免二次上滑适合列表较长的选择场景列表第一项固定为系统默认选项对应selectedPackage null给用户反悔的出口每一项都是一个 InstallerItem 卡片选中态用颜色区分选中时背景为primaryContainer.copy(alpha 0.3f)、标题加粗并在右侧显示CheckCircle图标第三步长按强制组件调用的隐藏彩蛋InstallerItem内部使用combinedClickable同时响应点击与长按combinedClickable( onClick onClick, onLongClick { onLongClick?.invoke() } )单击选择该安装器包名写入偏好长按切换该安装器强制组件调用状态列表项上会出现一把Lock小锁副标题额外显示 Activity 类名这就是 README 里提到的长按强制指定 Activity 组件功能——解决某些 App 硬编码了特定安装器组件、导致普通重定向失效的问题。状态同步把 SharedPreferences 接进 Compose ⚙️Xposed 模块有个特点设置可能随时被模块自身运行在系统进程中修改App 界面必须实时感知。InxLocker 的方案在 PrefsProvider.kt每个配置项声明为mutableStateOf如selectedInstallerPackage注册SharedPreferences.OnSharedPreferenceChangeListener值变化时同步写回对应State界面侧用snapshotFlow监听聚合快照仅在值真正变化时才更新局部StateMainActivity.kt 第283-313行LaunchedEffect(Unit) { snapshotFlow { PrefsSnapshot(...) }.collect { s - if (s.selectedPackage ! selectedPackage) selectedPackage s.selectedPackage // 其余字段同理先比较再写入避免无意义重组 } }这个快照比较 条件写入的写法非常实用既让界面与磁盘配置保持双向一致又避免了snapshotFlow每次触发都引发整屏重组。另外注意onCreate中会在进入 Compose 上下文之前预热初始化所有PrefsProvider状态第218-231行防止快照系统尚未就绪时读取到的值过期。新手可直接抄的要点清单 ✅最后把本文浓缩成一份可直接套用的清单BOM 管版本Compose 全家桶统一走platform(libs.androidx.compose.bom)少踩版本冲突坑主题三层降级动态取色 → 明暗色板 → 默认排版MaterialTheme一把梭卡片堆叠布局Scaffold LazyColumn spacedBy(16.dp)每个功能区块独立成卡组件化复用设置行/开关行拆成独立 Composable Immutable数据类参数即配置设计令牌所有间距、圆角、图标尺寸收进Dimensions对象杜绝魔法数字弹层选列表ModalBottomSheetskipPartiallyExpanded 固定默认首项 选中态着色手势分层combinedClickable把单击和长按分配给不同职责状态桥接外部存储用mutableStateOf声明snapshotFlow先比较再写入对照 MainActivity.kt 通读一遍源码约 900 行结构清晰你基本就掌握了Material 3 Compose 设置页 系统级选择列表的完整套路。祝编码愉快赞分享【免费下载链接】InxLockerXposed-based Installer Locker for Android (Powered by YukiHookAPI)项目地址https://gitcode.com/gh_mirrors/in/InxLocker点击查看免费下载相关推荐告别卡顿GlideJetpack Compose打造丝滑图片选择器告别卡顿GlideJetpack Compose打造丝滑图片选择器 Glide是一款专注于实现流畅滚动的Android图片加载和缓存库它能帮助开发者轻松解移动开发缓存图像处理CANN/driver PCIe带宽查询dcmiv2\_get\_pcie\_link\_bandwidth\_infoa nameEN US_TOPIC_0000002314204926 驱动开发人工智能CANNWinboat 启动失败排查完整指南10 分钟恢复 Linux 上运行 Windows 程序的桌面Winboat 启动失败排查完整指南10 分钟恢复 Linux 上运行 Windows 程序的桌面 WinBoat 让你在 Linux 上运行 Windows桌面应用虚拟化上一篇ReactDOM.render 首次渲染全流程解析just-react 带你走通 fiber 创建、Update 入队与三种模式入口下一篇深度解析Illustrator智能对象替换引擎replaceItems.jsx完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Skills工程实战指南:让AI编码代理稳定输出高质量代码

Skills工程实战指南:让AI编码代理稳定输出高质量代码

1. 为什么 AI 编码助手总是“差一口气” 先说个我自己的体会。这两年我几乎每天都在跟各种 AI 编码代理打交道,从最早只能补全代码块的插件,到后来能跑测试、改 bug 甚至独立完成小需求的智能体,工具迭代速度快得离谱。但你有没有发现一个尴尬…

2026/10/17 11:12:18 阅读更多 →
Claude Skills全自动写X短帖:设计与实现教程

Claude Skills全自动写X短帖:设计与实现教程

先说结论:这套“Claude Skills 全自动写社交平台X短帖”的方案,我已经在个人号上稳定跑了几个月,从选题、写草稿、人工确认到发布,基本把“每天打开应用憋文案”这个环节彻底砍掉了。标题里说的“搓了个Skill”,不是拿…

2026/10/17 11:11:17 阅读更多 →
基于YOLOv8的双目测距实现与工程优化实战

基于YOLOv8的双目测距实现与工程优化实战

双目测距这几年在自动驾驶、安防监控和机器人避障里用得越来越多,尤其是和YOLOv8这类检测模型结合以后,可以直接给检测框绑定距离信息,省掉了过去“先检测、再单独测距”的割裂流程。我做的这个模拟项目X,就是一套基于YOLOv8的双目…

2026/10/17 11:11:17 阅读更多 →

最新新闻

ORM选型:MyBatis、MyBatis-Plus与JPA怎么选

ORM选型:MyBatis、MyBatis-Plus与JPA怎么选

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
主动均衡原理与MP2642GR-Z+PIC18F8520工程实现

主动均衡原理与MP2642GR-Z+PIC18F8520工程实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
PacketTracer设备接入OneNET云平台:物联网上云的仿真到真实实践

PacketTracer设备接入OneNET云平台:物联网上云的仿真到真实实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
基于MP2642GR-Z与PIC18F4455的两节串联电池主动均衡方案设计与实现

基于MP2642GR-Z与PIC18F4455的两节串联电池主动均衡方案设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
claude code常用指令速查:从slash命令到CLI flags的TaoToken实战手册

claude code常用指令速查:从slash命令到CLI flags的TaoToken实战手册

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
Visual Studio Debug/Release 自动切换库路径与DLL拷贝方案

Visual Studio Debug/Release 自动切换库路径与DLL拷贝方案

1. 这个需求到底在解决什么问题做过Windows平台C开发的人,大概率都遇到过这样一个场景:你写了一个基础库,编译出来两个版本——Debug版和Release版,分别放在Debug/和Release/两个目录下。然后你有一个上层应用工程,开发…

2026/10/17 13:13:21 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →