以编程方式更改活动主题

时间:2012-07-19 13:33:59

标签: android

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

第一项活动:

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

感谢。

5 个答案:

答案 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();