在java中更改主题不会改变背景颜色
我试图用java代码更改运行时的主题,因为我想让用户能够通过首选项菜单更改应用程序主题。 所以,我让用户的主题,然后读取结果是这样的:在java中更改主题不会改变背景颜色
if (...) {
getApplication().setTheme(R.style.BlackTheme);
} else {
getApplication().setTheme(R.style.LightTheme);
}
不幸的是,由于某种原因,这并不工作.... 的字体颜色稍微暗灰色(光主题)转移到一个更明亮的灰色(黑色主题) ,但背景始终保持白色/黑色(取决于最初在清单文件中选择哪个主题)
如果我完全删除清单文件中的主题条目,仿佛我会选择黑色主题....
....我有忽略的东西吗?
您不能在运行时设置应用程序主题。如果你想改变无处不在的主题,在您的应用程序,你必须调用
setTheme(渣油)
在活动的onCreate第一件事()。
如:
@覆盖公共无效的onCreate(捆绑savedInstanceState){ setTheme(渣油)}
如果你想改变已经开始活动的主题,那么你必须重新创建它们。
我该如何让用户更改设置中的主题,然后将其切换到该主题? 我必须先摧毁应用程序吗?这不会与在Manifest中设置的主题相冲突吗? – RazorHail
我有同样的问题,我用这种方式解决了..
@Override
public void onCreate(Bundle savedInstanceState) {
if (getIntent().hasExtra("bundle") && savedInstanceState==null){
savedInstanceState = getIntent().getExtras().getBundle("bundle");
}
//add code for theme
switch(theme)
{
case LIGHT:
setTheme(R.style.LightTheme);
break;
case BLACK:
setTheme(R.style.BlackTheme);
break;
default:
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//code
}
这个代码是重新创建活动节省捆绑和更改主题。 你必须自己编写onSaveInstanceState(Bundle outState); 从API-11,您可以使用该方法重新创建(),而不是
Bundle temp_bundle = new Bundle();
onSaveInstanceState(temp_bundle);
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("bundle", temp_bundle);
startActivity(intent);
finish();
这应该在setContentView之前调用,所以你可能需要重新“创建”你的活动 –
不,这是行不通的。我只是调用setContentView(R.layout.blabla);然后它应该被“重新创建”,对吧? 好吧,它不工作: -/ – RazorHail