在特殊情况下,我需要从我的活动中删除对话框主题,但它似乎不起作用。这是一个例子
第一项活动:
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
感谢。
答案 0 :(得分:147)
正如docs所述,您必须在任何视图输出之前调用setTheme
。似乎super.onCreate()
参与view
处理。
因此,要动态切换主题,您只需在setTheme
之前调用super.onCreate
,如下所示:
public void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
答案 1 :(得分:31)
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()。您将以这种方式覆盖在此上下文中获取当前主题的每个请求。
答案 2 :(得分:11)
我知道我迟到但我想在这里发布一个解决方案:
检查完整的源代码here。
这是我在使用首选项更改主题时使用的代码。
#box {
width:100px;
height:100px;
background:red;
}
请注意,您必须将代码放在setcontentview ..
之前快乐的编码!
答案 3 :(得分:0)
这个对我来说很好:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
theme.applyStyle(R.style.AppTheme, true)
setContentView(layoutId)
onViewCreated(savedInstanceState)
}
答案 4 :(得分:0)
我已经使用此代码实现了暗模式...对我来说效果很好...您可以在开机时使用它....监听器...
//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();