Java中更改主题不会改变背景颜色。

4

我正在尝试使用Java代码在运行时更改主题,因为我希望用户能够通过首选项菜单更改应用程序主题。所以,我让用户选择主题,然后像这样读取结果:

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

很不幸,由于某些原因,这种方法不起作用...... 字体颜色从较深的灰色(浅色主题)略微偏向较亮的灰色(黑色主题),但背景始终保持白色/黑色(取决于最初在清单文件中选择的主题)。

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

......我有什么忽略的吗?


这应该在setContentView之前调用,因此您可能需要重新“创建”您的活动。 - Sherif elKhatib
不,那样行不通。我只是调用setContentView(R.layout.blabla);然后它应该被“重新创建”,对吧?嗯,它不起作用 :-/ - RazorHail
3个回答

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

}

这段代码用于重新创建Activity并保存Bundle和更改主题。 你需要编写自己的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();

0

0

你不能在运行时设置应用程序主题。如果你想要在应用程序的任何地方更改主题,你必须在Activity的onCreate()方法中首先调用

setTheme(resId)

例如:

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

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


1
用户如何在设置中更改主题并切换到该主题?我是否需要先销毁应用程序?这不会与清单中设置的主题冲突吗? - RazorHail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接