如何切换活动的主题

时间:2016-09-06 19:38:37

标签: android android-layout android-theme android-styles

情况就是这样:

  1. 我有DogActivity和FavoritesActivity。 DogActivity只是一个ListView。单击列表中的Dog时,会将您带到FavoritesActivity。
  2. 我想准备好一些主题。它们不需要动态生成。它们已经可以以xml格式存在。
  3. 根据用户从列表中选择的狗,我希望在我之前存在的主题之一中显示FavoritesActivity。
  4. 我听说有关ContextWrapper的讨论,但我不知道如何应用它。关于如何实现这一点的任何想法?

    详细说明:

    这是通常的单一主题

    for v21 / styles.xml

    <resources>
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <item name="android:colorControlHighlight">@color/colorAccentLight</item>
            <item name="android:colorControlNormal">@color/colorAccent</item>
            <item name="android:itemTextAppearance">@style/AppTheme.itemTextStyle</item>
            <item name="popupMenuStyle">@style/PopupMenu.MyAppTheme</item>
        </style>
    
        <style name="AppTheme.NoActionBar">
            <item name="windowActionBar">false</item>
            <item name="windowNoTitle">true</item>
            <item name="android:windowDrawsSystemBarBackgrounds">true</item>
            <item name="android:statusBarColor">@android:color/transparent</item>
            <item name="android:colorControlHighlight">@color/colorAccentLight</item>
        </style>
    
        <style name="AppTheme.itemTextStyle" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
            <item name="android:textColor">@color/colorPrimary</item>
        </style>
    </resources>
    

    for styles.xml

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    

    我想做:

    基本上我只想动态更改colorPrimary,colorPrimaryDark和colorAccent,并使用它们来更改所有样式和主题以及xml布局。因此,如果我可以在启动FavoritesActivity之前更改这些颜色,那么这将解决我的问题。

3 个答案:

答案 0 :(得分:1)

我在我的最新项目中完成了它,你只需要通过Java在主题上设置值。如下代码:

public class FavoritesActivity extends AppCompatActivity { // it can be Activity too

@Override
public void onCreate(Bundle savedInstanceState) {
   if( ... check condition to change theme ) {
      // this will replace every value from FavoritesActivity theme by the
      // the values on `other_style` theme. 
      getTheme().applyStyle(R.style.other_style, true);
   }
   // call super AFTER applying the theme
   super.onCreate(savedInstanceState);

   .. carry on your normal stuff
}

这非常有用,因为您可以非常轻松地替换几个值并将其余值保留为原始值,或者更改原始值。这完全取决于您传递给applyTheme方法的参数。

同样很棒的是你不必使用ContextThemeWrapper进行模拟。这些价值就在主题上,就是这样。

http://www.cplusplus.com/reference/string/string/substr/,布尔值)

答案 1 :(得分:1)

您可以将狗类型作为Intent extra发送,然后使用setTheme()方法设置相应的主题。

对于这个例子,假设你只有两个主题:

<style name="AppThemeOne" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppThemeTwo" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimaryCustom</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDarkCustom</item>
    <item name="colorAccent">@color/colorAccentCustom</item>
</style>

然后,在DogActivity中,将Intent Extra设置为用户从ListView中选择的Dog类型:

Intent intent = new Intent(DogActivity.this, FavoritesActivity.class);
intent.putExtra("dog_type", "terrier");
startActivity(intent);

然后,在FavoritesActivity中,加载正确的主题:

@Override
protected void onCreate(Bundle savedInstanceState) {

    String dogType = getIntent().getStringExtra("dog_type");
    if (dogType.equals("terrier")) {
        setTheme(R.style.AppThemeOne);
    } else {
        setTheme(R.style.AppThemeTwo);
    }
    super.onCreate(savedInstanceState);
    setContentView(R.layout.favorites_layout);
    //.....
 }

答案 2 :(得分:0)

您可以使用this.recreate()方法。

基于https://stackoverflow.com/a/29722976/7547681的答案。