如何以编程方式设置整个应用程序的主题?
How to set the entire application's theme programmatically?
我可以在清单中设置应用程序的主题,如下所示:
<application>
android:theme="@style/AppTheme.NoActionBar"
<!-- Activities here -->
</application>
我也知道如何在清单中和以编程方式设置活动的主题。
我想知道的是如何以编程方式设置整个应用程序的主题(我打算允许用户在多个主题之间select)。
一种解决方案是将 selected 主题应用于 onCreate
方法中的所有活动,但我有相当多的活动。有更简单的解决方案吗?
正如您在 this post 中看到的那样,不可能像您期望的那样设置应用程序的整个主题。
但是您可以使用 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();
并且在任何 Activity 之前实现这段代码 super.onCreate(savedInstanceState):
SharedPreferences prefs =
getSharedPreferences("mypref",
MODE_PRIVATE);
int styleId = prefs.getInt("idName",
R.style.defaultStyle);
//set Activity theme
setTheme(styleId);
更新:
并且为了避免重复代码,
像这样创建自定义 Activity class:
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);
}
}
并简单地从自定义 Activity 而不是 Activity 扩展您的活动:
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);
希望对您有所帮助。
我可以在清单中设置应用程序的主题,如下所示:
<application>
android:theme="@style/AppTheme.NoActionBar"
<!-- Activities here -->
</application>
我也知道如何在清单中和以编程方式设置活动的主题。
我想知道的是如何以编程方式设置整个应用程序的主题(我打算允许用户在多个主题之间select)。
一种解决方案是将 selected 主题应用于 onCreate
方法中的所有活动,但我有相当多的活动。有更简单的解决方案吗?
正如您在 this post 中看到的那样,不可能像您期望的那样设置应用程序的整个主题。 但是您可以使用 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();
并且在任何 Activity 之前实现这段代码 super.onCreate(savedInstanceState):
SharedPreferences prefs =
getSharedPreferences("mypref",
MODE_PRIVATE);
int styleId = prefs.getInt("idName",
R.style.defaultStyle);
//set Activity theme
setTheme(styleId);
更新: 并且为了避免重复代码, 像这样创建自定义 Activity class:
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);
}
}
并简单地从自定义 Activity 而不是 Activity 扩展您的活动:
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);
希望对您有所帮助。