Android 应用使用theme处理全局焦点框

news/2024/9/17 16:22:39/ 标签: android

背景

  • 我的应用有个需求,要求处理keycode事件,进行焦点移动处理,必须定制指定的焦点框。
  • 而系统的焦点框是固定了,为了保证平台的一致性,没办法直接修改。

问题

  1. 经过沟通,大部分都是自行修改了自己的background的属性,定制了焦点框,因为所需要处理的焦点框数量有限,进行了特殊修改
  2. 我的应用涉及的内容比较多,如果一个个修改,不仅工作量很大,还需要新增很多布局,并且修改掉原来的架构。

尝试

查看源码焦点框如何处理

系统也只是在overlay下面配置了一个属性,属性如下:

<item name="android:selectableItemBackground">@*android:drawable/item_background</item>

给这个属性配置了一个选择器,只要修改这个选择器,就可以改变系统全局焦点框。

是否有方法可以新增theme替换?

经过资料查询,需要新增一套主题包,替换才能起作用,工作量和周期太长,无法短时间内完成,且需要配合的相关方太多,暂时放弃此方案

是否可以在自己应用内部修改主题?

修改application应用的主题

  1. 首先修改应用自己的默认主题
<style name="Theme.system" parent="Theme.AppCompat.DayNight"><item name="android:windowNoTitle">true</item><item name="android:windowFullscreen">false</item><!-- 兼容API 7--><item name="android:windowActionBar">false</item><item name="android:windowIsTranslucent">true</item><item name="android:selectableItemBackground">@drawable/item_all_app_selector</item>
</style>
  1. Selector
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_focused="true"><shape android:shape="rectangle"><solid android:color="@color/transparent" /><stroke android:width="8dp" android:color="@color/view_on_click_background" /></shape></item><item android:state_focused="false"><shape><solid android:color="@color/transparent" /></shape></item></selector>
  1. 由于应用的特殊性,是没有Activity存在的,由addview和系统AlterDialog组成,修改系统主题之后,是没办法直接使用的。
  2. 首先修改系统Alter Dialog手动给他加载主题
private var mAllAppDialog: AllAppDialog = AllAppDialog(Utils.getContext(),R.style.Theme_dialog)
  1. 显示出来之后,发现有问题,因为之前是使用的系统默认的主题,加载了自定义主题时候,整个效果发生了变化,背景颜色和原有的高斯模糊都失效了,但是修改的焦点框是可以生效的
  2. 随后进行分析,我们使用的是通用的应用主题,也就是parent=“Theme.AppCompat.DayNight” 的主题是没办法给系统级别的AlterDialog用的。他不仅会给AlterDialog增加一个承载的黑色背景还会修改显示效果。
  3. 查看源码,源码是有专门为AlterDialog使用的主题。

创建新的主题

  1. 查看源码得到方向后,创建新的主题,parent=“Theme.AppCompat.Dialog.Alert”。仅增加一个指定的焦点框,并且修改背景为透明
<style name="Theme.dialog" parent="Theme.AppCompat.Dialog.Alert"><item name="android:selectableItemBackground">@drawable/item_all_app_selector</item><item name="android:background">@color/transparent</item>
</style>
  1. 再次尝试加载,加载成功,可以正常显示
  2. 扩展到其他的AlterDialog,统一使用加载指定的主题

异常情况

  1. 当扩展到其他的AlterDialog之后,发现有一个部分AlterDialog是无法正常加载主题的
  2. 因为每个对话框的业务逻辑和显示效果不同,一时没有分析到指定的问题
  3. 对比两类对话框,也没发现具体的问题原来
  4. 查找资料,也没有相关的资料说明
  5. 切换方向思考,对Context进行处理,为他加载主题
fun getWrapperContext():ContextThemeWrapper{return  ContextThemeWrapper(Utils.getContext(),R.style.Theme_dialog)
}
  1. 使用新的Context,进行调试,可以生效。将所有异常的AlterDialog全部使用新的Content处理。
private var mMessageDialog: MessageDialog = MessageDialog(getWrapperContext())
private var mAccountDialog: AccountDialog = AccountDialog( getWrapperContext())

addview处理

  1. WindowManager 的addView方法进行加载的。addview方法是没办法直接加载主题的。
  2. 使用加载主题的Context初始化需要加载的View,再进行加载。主题正常加载
val wContext=ContextThemeWrapper(mContext,R.style.Theme_dialog)
Bar = View.inflate(wContext, R.layout.bar_view, null)
  1. 效果如下:

总结

修改应用全局焦点框

只对activity生效,主题如下

<style name="Theme.system" parent="Theme.AppCompat.DayNight"><item name="android:windowNoTitle">true</item><item name="android:windowFullscreen">false</item><!-- 兼容API 7--><item name="android:windowActionBar">false</item><item name="android:windowIsTranslucent">true</item><item name="android:selectableItemBackground">@drawable/item_all_app_selector</item>
</style>

修改指定的View焦点框

所有控件都可以用

<style name="Theme.dialog" parent="Theme.AppCompat.Dialog.Alert"><item name="android:selectableItemBackground">@drawable/item_all_app_selector</item><item name="android:background">@color/transparent</item>
</style>

构建带主题的Context

fun getWrapperContext():ContextThemeWrapper{return  ContextThemeWrapper(Utils.getContext(),R.style.Theme_dialog)
}

http://www.ppmy.cn/news/1524948.html

相关文章

ARM base instruction -- cset

CSET Conditional Set sets the destination register to 1 if the condition is TRUE, and otherwise sets it to 0. 如果条件为TRUE&#xff0c;则条件集将目标寄存器设置为1&#xff0c;否则设置为0。 32-bit variant Applies when sf 0. CSET <Wd>, <…

Spark MLlib模型训练—推荐算法 ALS(Alternative Least Squares)

Spark MLlib模型训练—推荐算法 ALS(Alternative Least Squares) 如果你平时爱刷抖音,或者热衷看电影,不知道有没有过这样的体验:这类影视 App 你用得越久,它就好像会读心术一样,总能给你推荐对胃口的内容。其实这种迎合用户喜好的推荐,离不开机器学习中的推荐算法。 在…

SimPO

添加链接描述 优化点两个&#xff1a; gamma长度正则 gamma 原始DPO把两部分母拿出来是 − l o g π r e f ( w i n ) π r e f ( l o s e ) -log \frac{\pi_{ref}(win)}{\pi_{ref}(lose)} −logπref​(lose)πref​(win)​ 由于构建数据集时常常把不满意的大模型输出作为…

操作系统 ---- 调度算法【先来先服务(FCFS)、最短作业优先(SJF)、最高响应比优先(HRRN)】

目录 一、常见的调度算法 1. 先来先服务&#xff08;FCFS, First-Come, First-Served&#xff09; 2. 最短作业优先&#xff08;SJF, Shortest Job First&#xff09; 3. 优先级调度&#xff08;Priority Scheduling algorithm&#xff0c;PSA&#xff09; 4. 轮转调度&am…

python 函数 封装

封装 函数的参数是&#xff1a;变量 def 函数(参数):print(参数)if __name__ __main__:函数(参数)函数(参数2)函数的参数是&#xff1a; 字典 import requests# 定义一个字典 data {} 地址 "https://webdriveruniversity.com/" 请求方法 getdata["url"…

Hi3519DV500_Uboot环境变量的编译和烧录

Hi3519DV500_Uboot环境变量的编译和烧录 U-Boot 环境变量在嵌入式系统的引导加载程序中扮演着重要的角色。它们用于存储系统启动时所需的配置信息&#xff0c;如启动命令、内核和根文件系统的位置、串口波特率等。以下是一些常用的 U-Boot 环境变量及其用途&#xff1a; bootde…

安宝特案例 | AR如何大幅提升IC封装厂检测效率?

前言&#xff1a;如何提升IC封装厂检测效率&#xff1f; 在现代电子产品的制造过程中&#xff0c;IC封装作为核心环节&#xff0c;涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商&#xff0c;负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…

使用vuex模仿el-table

1、vuex 在main.js引入 import Vue from vue; import Vuex from vuex;Vue.use(Vuex);const store new Vuex.Store({state: {// 定义要传递的数据datas: []},mutations: {// 定义修改数据的 mutationSET_DATAS(state, newDatas) {state.datas newDatas;}},actions: {// 定义…

Java面试篇基础部分-Java的类加载机制

JVM的类加载 JVM在运行Java文件的时候,类加载分为5个阶段:加载、验证、准备、解析、初始化。在类初始化加载完成之后,就可以使用这个类的信息了。当这个类不需要使用的时候,就可以从JVM进行卸载。 加载 加载是指JVM读取Class文件的操作,并且根据Class的文件描述创建对应的…

聚鼎科技:现在做装饰画是靠谱的吗

在生活的各个角落&#xff0c;艺术以多种形式存在着&#xff0c;而装饰画作为其中的一种&#xff0c;一直以其独特的魅力填充着我们的世界。但在这个快速变化的时代&#xff0c;许多人会问&#xff1a;现在做装饰画还是一个靠谱的选择吗? 装饰画的市场依旧充满生机。随着人们对…

Java ssm超市订单管理系统(详细文档)

学生选课系统论文 摘要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设小…

Linux从入门到开发实战(C/C++)Day10-线程

1.概念&#xff1a; 线程是一个函数&#xff0c;是os调度的基本单位 Linux内核在2.2版本之前&#xff0c;是没有线程的概念&#xff0c;只有有限个进程&#xff08;4096&#xff09; 在2.4版本中&#xff0c;有了线程的概念&#xff0c;而且可…

安全工具 | 使用Burp Suite的10个小tips

Burp Suite 应用程序中有用功能的集合 img Burp Suite 是一款出色的分析工具&#xff0c;用于测试 Web 应用程序和系统的安全漏洞。它有很多很棒的功能可以在渗透测试中使用。您使用它的次数越多&#xff0c;您就越发现它的便利功能。 本文内容是我在测试期间学到并经常的主要…

配环境时的一些记录

连centos&#xff1a;正常连就好&#xff08;密码验证码&#xff09;连rocky&#xff1a;需要在centos上连&#xff0c;终端里直接ssh [rocky_ip]&#xff1b;在vscode中需要&#xff1a; 修改配置文件&#xff1a;打开命令面板&#xff08;ctrlshiftp&#xff09; -> 输入并…

Android命令行查看CPU频率和温度

在 Android 设备上&#xff0c;你可以通过命令行工具 adb 来查看 CPU 温度和 CPU 频率&#xff0c;并确定是否有降频情况。以下是具体步骤&#xff1a; 1. 查看 CPU 频率 你可以使用以下命令来查看 CPU 各个核心的当前频率&#xff1a; adb shell cat /sys/devices/system/c…

基于Spring Boot的旧物置换网站

构建一个基于Spring Boot的旧物置换网站是一个很好的项目&#xff0c;可以帮助你学习如何设计和实现一个完整的Web应用程序。以下是一个简化版的示例&#xff0c;展示了如何搭建这样一个系统的框架。 1. 创建Spring Boot项目 首先&#xff0c;你需要创建一个新的Spring Boot项…

VUE,element-ui,优化tabs组件每次点击,所有子页面都重新渲染问题

1.在data中定义每个子组件相应的值&#xff0c;ture为加载&#xff0c;false为不加载。 2.在子组件中使用v-if来判断是否渲染当前页面 3.在函数中对子组件的值进行切换。 handleClick(){if(this.activeNamefirst){this.pageOne truethis.pageTwo false}else if(this.active…

如何识别和防范跨站请求伪造(CSRF)?

识别和防范跨站请求伪造&#xff08;CSRF&#xff09;的关键在于理解其攻击原理并采取相应的措施。以下是一些识别和防范CSRF的方法&#xff1a; 识别CSRF的方法&#xff1a; 异常请求&#xff1a;留意网站中是否有意外的GET或POST请求&#xff0c;尤其是那些涉及到敏感操作&a…

PostgreSQL-05-入门篇-数据分组

文章目录 1. GROUP BY 分组简介示例1) 不使用聚合函数的 GROUP BY2) 使用 SUM() 函数的 GROUP BY3) 结合 JOIN 子句的 GROUP BY4) 使用 COUNT() 函数的 GROUP BY5) 多列 GROUP BY6) 使用日期列的 GROUP BY 2. HAVING 子句简介HAVING 对比 WHEREPostgreSQL HAVING 子句示例1) 使…

【Java-简单练习题】

1.”AABBBCCC“>>"A2B3C3" public class Test6 {public static void main(String[] args) {String ns "AABBBCCCC";String retcompress(ns);System.out.println(ret);}public static String compress(String str) {StringBuilder ret new StringB…