以编程方式更改活动的主题

在特殊情况下,我需要删除对话框主题从我的活动,但它似乎不工作。举个例子

第一项活动:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}

第二项活动:

public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setTheme(android.R.style.Theme);
setContentView(R.layout.activity_second);
}

摘录:

 <activity android:name="SecondActivity" android:theme="@android:style/Theme.Dialog"></activity>

当我运行它时,它仍然是对话主题的。

API10

谢谢。

156135 次浏览

正如 医生所说,您必须在任何视图输出之前调用 setTheme。看来 super.onCreate()参与了 view的加工过程。

因此,要在主题之间动态切换,你只需要像下面这样在 super.onCreate之前调用 setTheme:

public void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}

我知道我迟到了,但我想在这里贴出一个解决方案:
检查完整的源代码 给你
这是我在使用首选项改变主题时使用的代码。

SharedPreferences pref = PreferenceManager
.getDefaultSharedPreferences(this);
String themeName = pref.getString("prefSyncFrequency3", "Theme1");
if (themeName.equals("Africa")) {
setTheme(R.style.AppTheme);






} else if (themeName.equals("Colorful Beach")) {
//Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
setTheme(R.style.beach);




} else if (themeName.equals("Abstract")) {
//Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();


setTheme(R.style.abstract2);


} else if (themeName.equals("Default")) {


setTheme(R.style.defaulttheme);


}

请注意,您必须将代码放在 setcontentview 之前。

编码愉快!

User1462299的响应非常好,但是 如果包含碎片的话,他们将使用原来的活动主题。要将主题应用到所有片段,你可以改用上下文的 覆盖 getTheme ()方法:

@Override
public Resources.Theme getTheme() {
Resources.Theme theme = super.getTheme();
if(useAlternativeTheme){
theme.applyStyle(R.style.AlternativeTheme, true);
}
// you could also use a switch if you have many themes that could apply
return theme;
}

您不再需要在 onCreate ()方法中调用 setTheme ()。通过这种方式,您将重写每个请求,以获取此上下文中的当前主题。

这个对我很有用:

theme.applyStyle(R.style.AppTheme, true)

用法:

  override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//The call goes right after super.onCreate() and before setContentView()
theme.applyStyle(R.style.AppTheme, true)
setContentView(layoutId)
onViewCreated(savedInstanceState)
}

或使用 setTheme(R.style.AppTheme_Light):

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//The call goes right after super.onCreate() and before setContentView()
setTheme(R.style.AppTheme_Light)
setContentView(R.layout.activity_main)
}

我用这个代码来实现黑暗模式... 它对我来说工作得很好... 你可以用它在一个开关... 监听器..。

//setting up Night Mode...
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
//Store current mode in a sharedprefernce to retrieve on restarting app
editor.putBoolean("NightMode", true);
editor.apply();
//restart all the activities to apply changed mode...
TaskStackBuilder.create(getActivity())
.addNextIntent(new Intent(getActivity(), MainActivity.class))
.addNextIntent(getActivity().getIntent())
.startActivities();