在java中更改主题不会更改背景颜色

时间:2011-09-19 14:47:40

标签: android themes android-manifest sharedpreferences

我正在尝试使用java代码更改运行时的主题,因为我希望用户能够通过首选项菜单更改app主题。 所以,我让用户主题,然后读取结果:

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

不幸的是,由于某些原因,这不起作用.... 字体颜色从深灰色(浅色主题)略微转变为更亮的灰色(黑色主题) 但背景总是保持白/黑(取决于最初在清单文件中选择的主题)

如果我完全删除了清单文件中的主题条目,那就好像我会选择黑色主题....

....我有什么东西可以忽略吗?

3 个答案:

答案 0 :(得分: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开始,您可以使用方法recreate()代替

Bundle temp_bundle = new Bundle();
onSaveInstanceState(temp_bundle);
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("bundle", temp_bundle);
startActivity(intent);
finish();

答案 1 :(得分:0)

您无法在运行时设置应用主题。如果要在应用程序中的任何位置更改主题,则必须调用

  

setTheme(渣油)

作为Activity的onCreate()中的第一件事。

例如:

  

@Override public void onCreate(Bundle savedInstanceState){             setTheme(resId)}

如果要更改已启动活动的主题,则必须重新创建它们。

答案 2 :(得分:0)

这是一个已知问题: https://code.google.com/p/android/issues/detail?id=3793

您必须手动更改背景颜色,setTheme()不会更改它。