2011-09-19 79 views
4

我试图用java代码更改运行时的主题,因为我想让用户能够通过首选项菜单更改应用程序主题。 所以,我让用户的主题,然后读取结果是这样的:在java中更改主题不会改变背景颜色

if (...) { 
    getApplication().setTheme(R.style.BlackTheme); 
} else { 
    getApplication().setTheme(R.style.LightTheme); 
} 

不幸的是,由于某种原因,这并不工作.... 的字体颜色稍微暗灰色(光主题)转移到一个更明亮的灰色(黑色主题) ,但背景始终保持白色/黑色(取决于最初在清单文件中选择哪个主题)

如果我完全删除清单文件中的主题条目,仿佛我会选择黑色主题....

....我有忽略的东西吗?

+0

这应该在setContentView之前调用,所以你可能需要重新“创建”你的活动 –

+0

不,这是行不通的。我只是调用setContentView(R.layout.blabla);然后它应该被“重新创建”,对吧? 好吧,它不工作: -/ – RazorHail

回答

0

您不能在运行时设置应用程序主题。如果你想改变无处不在的主题,在您的应用程序,你必须调用

setTheme(渣油)

在活动的onCreate第一件事()。

如:

@覆盖公共无效的onCreate(捆绑savedInstanceState){ setTheme(渣油)}

如果你想改变已经开始活动的主题,那么你必须重新创建它们。

+1

我该如何让用户更改设置中的主题,然后将其切换到该主题? 我必须先摧毁应用程序吗?这不会与在Manifest中设置的主题相冲突吗? – RazorHail

1

我有同样的问题,我用这种方式解决了..

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