【问题标题】:Change Theme Dynamically from User Input in Android从 Android 中的用户输入动态更改主题
【发布时间】:2021-09-27 08:24:17
【问题描述】:

我正在构建一个材料设计游乐场,它可以在可用的预定义主题之间切换,这些主题可以将颜色、排版和形状应用于整个应用程序的所有材料设计组件。

现在,用户可以从 PreferenceScreen 中选择可用的主题:

我有一个新要求,应该允许用户输入一个值(例如,设置 colorPrimary 的颜色)。从输入中,我想直接修改主题,以便它可以在应用程序中应用更改。

我该怎么做?我正在考虑为用户提供如下选项:

这是我的示例材料设计游乐场应用的链接: https://github.com/ciscosoriano/material-design-dynamic-theming

【问题讨论】:

    标签: android material-design themes android-theme material-components-android


    【解决方案1】:

    看来你需要这样的东西android-how-to-change-application-theme-programmatically

    link: android-how-to-change-application-theme-programmatically

    这应该很容易,而且那里有很多教程,别忘了结帐

    基本上你需要做的是:

    1. 在活动启动前照常应用静态定义的主题(在 res/values 中)。
    2. 现在在 Activity 启动时获取用户输入
    3. 然后使用适当的 api 获取当前主题属性,并在程序中动态重新着色 ui 控件。
    4. 使用更新的主题重新启动活动。

    更多链接:Set theme color dynamically

    您应该能够轻松地处理活动生命周期,以便在设置时查看更新的主题。

    【讨论】:

    • 感谢分享!但我已经在我的示例应用程序中这样做了。另外,我看到每个组件都设置了颜色。但我的目标是在应用程序中全局设置颜色。假设我有 50 个按钮,我想对所有按钮应用相同的颜色,但不是每个按钮一个一个地设置。
    • @ciscocode,如果您针对整个主题颜色说“primaryColor”,那么继承主题的控件也应该反映更改,如果这不是正在发生的事情,那么您的控件不是可能继承了活动设置的父主题。
    • @ciscocode 或者如果你的意思是说,你想通用地做到这一点,即代码的主题转换器部分在应用程序中是通用的,那么你可以将主题管理代码移动到 BaseActivity 中任何活动的父级(所有活动都必须扩展此 BaseActivity),并在创建任何新活动时自动处理它。
    • 只是一个提示:让主题选择器片段/活动将所选主题存储到首选项中,然后在创建新活动或导航到另一个活动时让具有主题管理代码的 BaseActivity 进行检查如果在创建目标活动时尚未更新,则强化偏好并更新当前主题。
    • 如果控件主题继承了主应用程序主题,那么应用程序主题的任何更改都应该自动应用于控件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2017-08-14
    • 2019-05-05
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多