我有一个在几个片段之间切换的活动。此活动具有默认样式,但是当我更改为某些特定片段时,我希望它更改样式。我做了一些研究,得到了在片段的onCreateView()中运行的代码:

// create ContextThemeWrapper from the original Activity Context with the custom theme
    Context context = new ContextThemeWrapper(getActivity(), R.style.GreyTheme);
    // clone the inflater using the ContextThemeWrapper
    LayoutInflater localInflater = inflater.cloneInContext(context);
    // inflate using the cloned inflater, not the passed in default

    View rootView = localInflater.inflate(R.layout.my_layout, container, false);


此代码仅在活动重新启动时才有效(例如:如果我旋转设备,它将根据需要更新为新样式)。我认为无法在没有重新创建活动的样式之间切换,还是我错了?

最佳答案

从技术上讲:不。

如果已创建活动,则无法更改当前主题。


  此代码仅在活动重新启动时才有效(例如:如果我旋转
  设备,它会更新为我想要的新样式)。我认为不是
  可以在样式之间切换,而无需重新创建活动或
  我错了吗?


由于轮换包括对活动的重新娱乐,因此这就是“起作用”的原因。

但是……有一个名为Pocket的应用程序(如果我没记错的话,也可以是Press和Firefox)可以巧妙地实现这一目的。

怎么做?

基本上,诀窍在于以下公式:

Base Color1 + Middle Color = Theme Color 1

Base Color2 + Middle Color = Theme Color 2


请记住,中间色是相同的。对于基色,您必须将其放入包含您的应用程序实例的Window中,如下所示:

getWindow().setBackgroundDrawable(new ColorDrawable(isLight ? Color.WHITE : Color.BLACK));


因此,当与中间颜色结合使用时,将为您提供两个不同的主题。

在这里,您可以看到如何做到的(它很好地解释了这个概念):

http://sriramramani.wordpress.com/2012/12/06/runtime-theme-change/

编辑1:

在链接文章中添加了更多说明

07-26 09:33
查看更多