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

在特殊情况下,我需要从我的活动中删除对话框主题,但似乎没有工作。 这是一个例子

第一次活动:

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

谢谢。

正如文档所说,您必须在任何视图输出之前调用setTheme 。 看来, super.onCreate()参与view处理。

因此,要dynamic切换主题,只需在super.onCreate之前调用setThemesuper.onCreate

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

user1462299的响应效果很好,但如果包含片段 ,则会使用原始活动主题。 要将主题应用于所有片段,您可以覆盖 Context 的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()。 您正在重写每个请求,以这种方式在此上下文中获取当前主题。

我知道我晚了,但我想在这里发布一个解决scheme:
检查完整的源代码在这里 。
这是使用偏好更改主题时使用的代码。

 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之前

快乐编码!