如何以编程方式设置整个应用程序的主题?

时间:2019-10-11 16:06:55

标签: android themes

我可以在清单中设置应用程序的主题,如下所示:

<application>
     android:theme="@style/AppTheme.NoActionBar"
<!-- Activities here -->
</application>

我还知道如何在清单中以及以编程方式设置活动主题。

我想知道的是如何以编程方式设置整个应用程序的主题(我打算允许用户在多个主题之间选择)。

一种解决方案是将所选主题应用于onCreate方法中的所有活动,但是我有很多活动。有没有更简单的解决方案?

1 个答案:

答案 0 :(得分:3)

正如您在this帖子中看到的那样,无法按预期设置应用整体主题。 但是,您可以使用SharedPreference对象在设置Activity中设置主题,并在所需的每个Activity中应用主题:

OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1-01-01 11:00:00

在“任何活动”中,在super.onCreate(savedInstanceState)之前实现这段代码:

//A method that return your styles id
int style_var=getStyle();

SharedPreferences.Editor editor 
=getSharedPreferences("mypref", 
MODE_PRIVATE).edit();
editor.putInt("idName", style_var); 
editor.apply();

更新: 为了避免重复代码, 创建一个这样的自定义Activity类:

SharedPreferences prefs = 
getSharedPreferences("mypref", 
MODE_PRIVATE);
int styleId = prefs.getInt("idName", 
R.style.defaultStyle);
//set Activity theme 
setTheme(styleId);

,只需从自定义活动(而不是活动)扩展活动:

 public class myBaseActivity extends Activity{

@Override
public void onCreate(Bundle savedInstanceState)
{
    SharedPreferences prefs = 
        getSharedPreferences("mypref",MODE_PRIVATE);
    int styleId = prefs.getInt("idName",R.style.AppTheme);
    //set Activity theme 
    setTheme(styleId);

    super.onCreate(savedInstanceState);
}
}

最后在设置“活动”中,执行以下代码以重新加载应用程序(例如,将其放入“保存并重新加载”按钮的Onclick方法中):

public class AnyActivity extends 
myBaseActivity{
@Override
public void onCreate(Bundle 
savedInstanceState)
{
super.onCreate(savedInstanceState);
    setContentView(R.layout.any);
}
}

我希望有帮助。