以编程方式更改活动的主题
在特殊情况下,我需要从我的活动中删除对话框主题,但似乎没有工作。 这是一个例子
第一次活动:
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
之前调用setTheme
就super.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之前
快乐编码!