首页 > 解决方案 > 如何以编程方式设置整个应用程序的主题?

问题描述

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

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

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

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

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

标签: androidthemes

解决方案


正如您在这篇文章中看到的,不可能按照您的期望设置应用程序的整个主题。但是您可以使用 SharedPreference 对象在设置 Activity 中设置主题,并在您想要的每个 Activity 中应用您的主题:

//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();

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

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

更新: 为了避免重复代码,创建一个自定义 Activity 类,如下所示:

 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);
}
}

并简单地从自定义活动而不是活动扩展您的活动:

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

最后在您的设置 Activity 中,实现这段代码以重新加载应用程序(例如将其放入“保存并重新加载”按钮的 Onclick 方法中):

Intent intent = new Intent(SettingActivityClass.this, YourAppMainActivity.class);
//replace YourAppMainActivity with SettingActivityClass if you want to stay in setting activity on reload
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                    Intent.FLAG_ACTIVITY_CLEAR_TASK |
                    Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

我希望这有帮助。


推荐阅读