如何在 Android 中动态切换 XML 样式?

2023-12-05

长话短说,我有一个应用程序,我在其中直接将样式属性应用于活动和片段的 XML 文件。现在我将其重构为styles.xml文件。我几乎不敢直接修改主题本身,因为我之前已经尝试过类似的东西,继承变得混乱。

所以,我的作品里有好几种这样的风格styles.xml file:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" >
    <style name="My_DarkMode" parent="Theme.MyApp">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
    </style>

    <style name="My_DarkMode.MaterialToolbar">
        <item name="android:background">@color/purple_500</item>
    </style>
    <style name="My_DarkMode.TextView">
        <item name="android:textColor">@color/white</item>
    </style>
    <style name="My_DarkMode.HighlightedText">
        <item name="android:textColor">@color/yellow_4text</item>
    </style>
    <style name="My_DarkMode.TabLayout">
        <item name="android:background">@color/tab_grey</item>
        <item name="tabIndicatorColor">@color/tab_indicator</item>
        <item name="tabSelectedTextColor">@color/tab_selected_text</item>
        <item name="tabTextColor">@color/tab_text</item>
    </style>
    <style name="My_DarkMode.FragmentBg">
        <item name="android:background">@color/black</item>
    </style>
    <style name="My_DarkMode.MainBg">
        <item name="android:background">@color/activity_grey</item>
    </style>
    <style name="My_DarkMode.SearchBar">
        <item name="android:background">@color/white</item>
        <item name="android:textColor">@color/black</item>
    </style>
<!-- etcetera... -->

因此,我用活动和片段内的 XML 对象中的这些样式之一替换了硬编码属性。这很好用。 (请注意,不同的 XML“视图对象”可能使用所有这些样式中的一种或另一种)。

那么问题来了:

因此,让我们想象一下,我采用所有这些样式并复制其中的每一种样式,但使用不同的名称:而不是命名它们My_DarkMode or My_DarkMode.*,我给他们命名My_LightMode,并完全更改这些“LightMode 样式”的调色板(因此,将它们用作某种主题)。

所以,这个想法将以编程方式切换:

<!-- It's a little pseudo-code, for summarizing the thing -->
<TextView
    style="@style/My_DarkMode.TextView"
    android:id="[...]" />
<TextView
    style="@style/My_DarkMode.HighligthedText"
    android:id="[...]" />
<!-- [...] -->

...到此(但对于比这更多的 XML 元素):

<TextView
    style="@style/My_LightMode.TextView"
    android:id="[...]" />
<TextView
    style="@style/My_LightMode.HighlightedText"
    android:id="[...]" />
<!-- [...] -->

通过Java(你知道,通过单击某个按钮或类似的东西:我不关心如何触发这个问题,而是我应该使用哪些指令),切换样式的正确方法是什么要施加?我不能以某种方式将所有这些样式分组到一个主题或其他东西中吗?看来我别无选择,只能做类似的事情,因为如果我从主题应用其中的一些内容并让继承完成它的工作,那么 SearchView 就会继承白色字母(带有白色背景;所以你可以明白我的意思混乱)...而且,我对 Android 风格和主题的了解确实有限。

作为记录

我知道我的这种方法可能根本不是一个好的方法。除此之外:因为我对 Android 中的样式、主题和样式继承层次结构如何工作一无所知。 (我的意思是,如果我保留这种方法,也许我的 XML 代码会太湿?我想知道......)如果是这样,欢迎使用更简洁的方法。

如果这是 HTML 和 CSS,出于某种原因我将能够更容易地解决这个问题,或者我认为......

EDIT:说实话:无论我读了多少文档,比如Themes or 主题主颜色属性如何工作……读得越多,我就越困惑。尝试和错误也没有多大帮助......最近我尝试从 XML 布局中删除所有样式并从头开始主题;并尝试它是什么在这个链接里面我发现如果我这样做:

<item name="colorBackground">@color/purple_500</item>

...colorBackground只是不存在!无数次,有些东西不像文档中那样工作......叹息......

所以这里是:“从头开始的主题”。忘记所有style=我之前设置的:我把它们全部删除了。

My themes.xml:

<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <!-- all these ones were before, I started tweaking
         them and see what happens --> 
    <item name="colorPrimary">@color/purple_500</item>
    <item name="colorPrimaryVariant">@color/purple_700</item>
    <item name="colorOnPrimary">@color/black</item>

    <item name="colorSecondary">@color/teal_200</item>
    <item name="colorSecondaryVariant">@color/teal_700</item>
    <item name="colorOnSecondary">@color/white</item>

    <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
    <!-- <item name="toolbarStyle">@style/My_DarkMode.MaterialToolbar</item> -->
    <item name="toolbarStyle">@style/Widget.MaterialComponents.Toolbar.PrimarySurface</item>

    <item name="drawerArrowStyle">@style/Theme.MyApp.DrawerArrowStyle</item>

    <!-- and here I add new ones I din't knew before
         and start playing with them like crazy -->
    <item name="colorSurface">@color/activity_grey</item>
    <item name="colorOnSurface">@color/white</item>

    <item name="colorOnPrimarySurface">@color/yellow_4text</item>
    <item name="colorContainer">@color/activity_grey</item>
    <item name="colorOnBackground">@color/yellow_4text</item>
    <!-- It doesn't exist... sigh... vVv -->
    <!-- <item name="colorBackground">@color/black</item> -->
</style>

我很难想象、发现或达到哪些通用主题属性可以调整一些琐碎的事情,比如让所有 TextViews 显示具有相同颜色的文本,或者为什么colorSurface or colorContainer漆成灰色<NavigationView>,但不是<ConstraintLayout>的背景??我试图保持一切与以前相似,但有一个集中的主题,我可以通过编程从一个地方进行切换。

我在“Android 开发人员”中阅读了很多有关样式和主题以及它们应该如何协同工作的链接......但它们没有清楚地显示如何操作!如果有一种规范的方法可以在一个主题中加入多种样式,那就太好了或类似的东西...所以,您可以通过切换主题将不同的样式应用于不同的视图,就像它或多或少与 CSS 类一起工作一样。

Old:

(before wanting to extract a theme) old_1 old_2 old_3

新的混乱:

(removed styles from Layouts and started modifying Theme from scratch) new_mess_1 new_mess_2 new_mess_3


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Android 中动态切换 XML 样式? 的相关文章

随机推荐

  • 最小设定差

    我在这个名为 codility 的网站上遇到了这个问题 但我真的不知道如何解决它 将不胜感激 给定一个包含 n 个整数的数组 A 以及包含 n 个元素 1 或 1 的序列 S 我们定义该值 假设零元素之和等于零 写一个函数 int min
  • 将 select_lated 查询的数据结果序列化为 json

    如何将带有 select 相关查询的输出序列化为 json 当我使用 select lated 序列化查询中的数据时 生成的 json 不包含相关字段数据 表架构 from django db import models class Use
  • 如何使用 Glassfish 实现基本身份验证?

    我尝试过这个配置 但它对我不起作用 Glassfish 中的基本身份验证我也尝试过这个指南http maksim sorokin dk it 2010 10 13 basic authentication in glassfish 3 但我
  • 为什么新的 Java 8 Date Time API 没有纳秒精度? [复制]

    这个问题在这里已经有答案了 Java 8 中新的 Date Time API 的功能之一应该是纳秒精度 但是 当我像这样将当前日期时间打印到控制台时 DateTimeFormatter formatter DateTimeFormatter
  • 如何显示前 n 个元素,然后展开以显示剩余元素?

    我有一个元素列表 假设有 10 个 并且在页面加载时只显示前 4 个 点击more将展开列表并显示剩余元素 我的 html 代码如下所示 div div class listContainer ul li 1 li li 2 li li n
  • SQL Server 2012

    有没有办法导出 SQL Server 2012 的 DDL 先前的此类性质问题已于 2009 年 12 月回答过 但似乎并不适用 之前的回答 对于 SQL Server 在 SQL Server Management Studio 中 右键
  • inno setup 需要有关开始菜单下图标组的帮助

    我正在使用 Inno 设置 我需要将我的程序图标放在我的公司组下的开始菜单中 我的 define MyAppPublisher publisher MyAppName game name 一些示例代码 Icons Name group My
  • 读取 .PNG 时,如何识别颜色簇并重写图像文件,以便每个簇都有唯一的 RGB 代码?

    继续这个问题 如何重写一个列表列表 以使值的 孤岛 彼此唯一 简介 您将如何解析图像 例如 通过这种方式 您可以识别不同像素的几个簇并重写文件 以便每个簇都有唯一的颜色 例如 以下是我如何在一些来源的帮助下尝试实现它 包括 stackove
  • 如何将图像加载到 Xcode 9 Playground 中?

    我花了几个小时试图简单地访问我的 Swift Playground 中的图像数据 我遵循了许多建议在目录中添加资源文件夹作为同级目录的教程 您的游乐场位于其中 或者将图像拖到游乐场导航器中的资源文件夹中 没有任何效果 我需要做什么才能在游乐
  • 为什么伪元素上的滤镜渐变在 IE8 中不起作用?

    I want to create buttons like these 在现代浏览器中 效果是使用插入框阴影和滤镜创建的 对于 IE8 选择伪元素 对于 IE7 我使用包含在条件注释中的特殊标签 Demo http jsfiddle net
  • 转义 T-SQL“模式”表达式字符类中的 ] 和 ^ 字符

    我正在尝试模仿 OracleRTRIM expression characters 在 MsSql Server 2008 R2 中使用以下查询 REVERSE SUBSTRING REVERSE field PATINDEX chars
  • 如何在Python中找到pow(a,b,c)的逆序?

    pow a b c python中的运算符返回 a b c 如果我的价值观是b c 以及该操作的结果 res pow a b c 我怎样才能找到值a Despite the statements in the comments this i
  • 如何使用jquery查找并检查树中的所有动态子复选框?

    我已动态地将复选框添加到所有元素 并成功添加了选择所有复选框的功能 但无法选择树结构中的父子复选框 这意味着如果我选择 亚洲 它应该选择所有 东亚 和 南亚 如果我选择东亚 它应该选择所有国家 反之亦然 var json Asia regi
  • 使用 Google Cloud Storage 从 Firebase 存储中删除文件夹

    我想删除文件夹 test 及其中的所有内容 我可以使用以下代码在终端成功删除 FirebaseStorage 中的文件夹及其所有内容 子文件夹 gsutil rm r gs bucketname appspot com test 然而 当我
  • 表格和屏幕阅读器

    我似乎无法让屏幕阅读器阅读简单的表格 我有以下 HTML table alt Account Information tr th Account Number th td 1111 1111 1111 td td nbsp nbsp td
  • 如何删除div中某个div之后的所有元素

    所以我有一个在其底部绘制动态元素的 div 我想隐藏这些元素 无论它们的 ID 使用 javaScript jQuery 是什么 基本上我的 HTML 看起来像这样 div class right panel div class info
  • Ajax:将整数数组发布到 Django

    我在用着数据表 我想让用户选择多行并删除它们 到目前为止 我已经让它工作了 所以它使用下面的代码删除了选择中的第一行 阿贾克斯代码 Add a click handler for the delete row delete click fu
  • Eclipse 中 Tomcat 上 Jersey 的基本完整配置

    我是 Jersey 的新手 正在尝试使用 Tomcat 和 eclipse 建立一个基本的 web 应用程序 我看过许多教程和示例 但它们彼此不同 或者省略了部分过程 例如使用 Spring 使用 web xml 文件 在 Tomcat 上
  • 如何使用 jQuery ajax 获取另一个页面上的 div 的 html?

    我正在使用 jQuery 的 ajax 代码来加载新页面 但希望他只获取 div 的 html 我的代码 HTML div div Script ajax url href type GET success function data co
  • 如何在 Android 中动态切换 XML 样式?

    长话短说 我有一个应用程序 我在其中直接将样式属性应用于活动和片段的 XML 文件 现在我将其重构为styles xml文件 我几乎不敢直接修改主题本身 因为我之前已经尝试过类似的东西 继承变得混乱 所以 我的作品里有好几种这样的风格sty