android - 如何以编程方式设置整个应用程序的主题?
问题描述
我可以在清单中设置应用程序的主题,如下所示:
<application>
android:theme="@style/AppTheme.NoActionBar"
<!-- Activities here -->
</application>
我也知道如何在清单中和以编程方式设置活动的主题。
我想知道的是如何以编程方式设置整个应用程序的主题(我计划允许用户在多个主题之间进行选择)。
一种解决方案是将所选主题应用于onCreate
方法中的所有活动,但我有很多活动。有没有更简单的解决方案?
解决方案
正如您在这篇文章中看到的,不可能按照您的期望设置应用程序的整个主题。但是您可以使用 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);
我希望这有帮助。
推荐阅读
- python - 'ValueError: 太多值无法解压'
- python - 当前的路径,关于,不匹配任何这些
- r - ggplot grouped geom_bar - 将因子类别的标签添加到 x 轴标签
- css - 在没有媒体查询的情况下表格线交叉的中心页面上的锚点图像
- git - 为什么git结帐后提示文件被修改?
- node.js - 如何在由 socketio-redis 管理的 socketio 进程集群中找到用户套接字
- angular - appModule 中的 NullInjection 错误:StaticInjectorError(AppModule)[BASE_URL]:
- python - 带有多个模块和打包命名空间的 Python 2.7 包安装
- javascript - 在DataTable中选择一行的按钮
- python-3.x - 有没有办法将位转换为int?