gpt4 book ai didi

Android:如何动态刷新 Activity/设置主题

转载 作者:行者123 更新时间:2023-11-29 14:39:50 24 4
gpt4 key购买 nike

我正在尝试在我的应用程序上实现主题切换,但我似乎无法在不重新启动整个 Activity (也称为 finish() + startActivity())的情况下刷新 Activity 并设置它们的主题。

我尝试使 findViewById(android.R.id.content) 无效,但它不会刷新 Activity 。鉴于再次调用 onCreate,更改方向会更改主题。

那么像 TweetLanes 这样的应用程序如何在无需重启应用程序/Activity 的情况下实现此功能?

谢谢

最佳答案

相当简单。

假设您有一个名为 /res/values/app_themes.xml 的资源文件。在此 xml 文件中,您可以定义您的应用程序样式。我们称它为 appGeneralTheme,它应该大致如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="appGeneralTheme">
<!- Ofc you would use meaningful names and a separate file for colours but it's not the point. Those could be even different drawables, different strings, any kind of value can be styled/themed-->
<item name="foo">#FF0000</item>
<item name="bar">#00FF00</item>
<item name="baz">#0000FF</item>
</style>
</resources>

现在让我们定义用户可以更改的那些特定主题。我们可以通过几种方式做到这一点:

  • 在同一个 app_themes.xml 文件中
  • 全部在另一个文件中,例如:pickables_themes.xml
  • 每个都在一个单独的文件中:qux_theme.xml、quux_theme.xml

为了简单起见,让我们将所有内容放在一个地方,因此在我们的 app_themes.xml 中,我们将添加修改后的主题:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="appGeneralTheme">
<item name="foo">#FF0000</item>
<item name="bar">#00FF00</item>
<item name="baz">#0000FF</item>
<!-- other items -->
</style>

<style name="quxTheme" parent="@style/appGeneralTheme">
<item name="foo">#FF00FF</item>
<item name="bar">#00FFFF</item>
<item name="baz">#FFFF00</item>
</style>
<style name="quuxTheme" parent="@style/appGeneralTheme">
<item name="foo">#FF0099</item>
<item name="bar">#00AAFF</item>
<item name="baz">#FF1100</item>
</style>
</resources>

为什么是parent?也许我们的样式只需要修改一小部分东西?也许我们想为特定值设置一些默认值?

那么如何应用呢?我们需要做几件事:

  1. 调用 Context.getTheme().applyStyle(resId, force)。在 Context 中,我们有一个很好的方法 Context.getTheme()此方法允许我们在主题对象上应用特定样式。 Theme.applyStyle(...) 的描述应该让您了解各种可能性:

Place new attribute values into the theme.

  1. 无论好坏,您都应该为 Activity 上下文和应用程序上下文执行这种样式的应用程序。

  2. 您不需要终止 Activity ,一个简单的Activity.recreate()会做。现在乐趣开始了。

一切都可能会闪烁,具体取决于您的应用程序的设计方式。现在我们有多种方法:- 多项 Activity - 单一 Activity - 多个 fragment - 没有 fragment -等等等等

这对最后的事情有影响。我只能根据我自己对单个 Activity + fragment 的经验告诉你,如果你有多个 fragment 交易,你将执行 Activity.recreate() 屏幕像迪斯科舞厅一样闪烁。

有一个解决方法(相当 hack-ish)。您不能重新创建整个 Activity ,而只能在最顶部可见的 fragment 上执行 FragmentTransaction.detach(Fragment).attach(Fragment).commit()。其他不可见的 fragment 应该没问题。

为什么这有用:

  • 您不需要将这些项(如:foobarbaz)定义为 appGeneralTheme,您可以在其他地方以任何样式定义那些(如果您应用该样式,它将覆盖)
  • 您可以应用多种样式,逐个交错项目以实现某些功能(根据另一种逻辑隐藏或显示某些内容)

适用于一般意义上的主题(颜色)以外的任何事物

关于Android:如何动态刷新 Activity/设置主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13832459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com