133

在特定情况下,我需要从我的活动中删除对话框主题,但它似乎不起作用。这是一个例子

第一项活动:

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

谢谢。

4

5 回答 5

208

正如文档所说,您必须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);
}
于 2012-07-20T09:23:51.050 回答
55

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()。您正在以这种方式覆盖每个请求以在此上下文中获取当前主题。

于 2016-08-25T16:24:04.590 回答
12

我知道我迟到了,但我想在这里发布一个解决方案:在此处 查看
完整的源代码。 这是我使用首选项更改主题时使用的代码..

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

快乐编码!

于 2015-10-23T15:11:33.723 回答
4

我已经使用此代码来实现暗模式...对我来说效果很好...您可以在打开时使用它...侦听器...

//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();

于 2020-10-31T13:21:55.983 回答
3

这对我来说很好用:

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)
}
于 2019-07-09T16:36:00.233 回答