如何以编程方式启用夜间模式?

时间:2017-11-26 11:18:21

标签: android night-shift

我正在寻找一种使用Android代码以编程方式启用夜间模式的方法:

    public static void setNightMode(Context target , boolean state){

    UiModeManager uiManager = (UiModeManager) target.getSystemService(Context.UI_MODE_SERVICE);

    if (state) {
        //uiManager.enableCarMode(0);
        uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
    } else {
       // uiManager.disableCarMode(0);
        uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
    }

}

我的屏幕上没有任何变化,夜间模式仍然禁用。 根据这个link

无需启用carMode或deskMode。 我在Android Studio上有以下logcat:

11-26 12:15:16.662 3823-3823/? D/UiModeManager: updateConfigurationLocked: mDockState=0; mCarMode=false; mNightMode=2; uiMode=33
11-26 12:15:26.802 3823-3823/? V/UiModeManager: updateLocked: null action, mDockState=0, category=null

感谢您的帮助。

5 个答案:

答案 0 :(得分:13)

最简单的解决方案

您可以通过以下方式启用/禁用深色主题:

  1. 启用深色主题:

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
  2. 强制禁用深色主题:

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
    
  3. 根据暗模式的移动设置来设置应用主题,即,如果启用了暗模式,则该主题将设置为暗主题;如果未启用,则 默认主题,但这仅适用于版本> = Android版本Q

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
    

注释:

  1. 您的应用/活动基本主题应该是

“ Theme.AppCompat.DayNight”

喜欢

<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>
  1. 您的res文件夹的名称以-night结尾,以便您可以为日夜主题设置不同的颜色和图像,例如

可绘制和可绘制的夜晚,
价值观与价值观之夜

答案 1 :(得分:1)

NightOwl有自己的实现,用于在Android上切换日/夜模式。 NightOwl入门非常简单。这是一段代码:

在Application类中初始化NightOwl,

NightOwl.builder().defaultMode(0).create();

在Activity类中调用三个方法

public class DemoActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // step1 before super.onCreate
        NightOwl.owlBeforeCreate(this);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);

        // step2 after setContentView
        NightOwl.owlAfterCreate(this);

        // write your code
    }

    @Override
    protected void onResume() {
        super.onResume();

        // step3 onResume
        NightOwl.owlResume(this);
    }

}

随意切换皮肤,

View v = findViewById(R.id.button);
v.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        NightOwl.owlNewDress(SettingActivity.this);
    }
});

答案 2 :(得分:1)

这段代码非常适合我,尽管您可能只需要重新启动应用程序。但请记住,此代码在系统范围内启用暗模式,而不仅仅是在应用中:

public static void setNightMode(Context target , boolean state){

    UiModeManager uiManager = (UiModeManager) target.getSystemService(Context.UI_MODE_SERVICE);

    if (VERSION.SDK_INT <= 22) {
        uiManager.enableCarMode(0);
    }
    
    if (state) {
        uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
    } else {
        uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
    }
}

这在 Kitkat 中对我有用。

答案 3 :(得分:0)

确保在 styles.xml 文件中将默认主题从Theme.AppCompat.Light.DarkActionBar更改为Theme.AppCompat.DayNight.DarkActionBar,然后执行AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)切换到夜间模式。我已经在APIv23(Android 6.0)及更高版本中对其进行了测试,并且工作正常。 有关更好的解释,请参见this codelab by Android

答案 4 :(得分:0)

请记住,Dark Mode 不是 Night Mode。他们是完全不同的。 DM 是在 Android 10 中引入的,它强制使用内置的黑白颜色,而 NM 在早期版本中使用默认/定义的样式,具体取决于您的实现。如果您希望您的应用使用您定义的亮/夜样式而不依赖于内置的暗样式,您可能需要在 themes.xml 或 style.xml 中将 forceDarkAllowed 设为 false,因为 DM 可能会发生冲突。

要将您的应用模式更改为夜间,请使用 AppCompatDelegate。

// This will be the top level handling of theme
        AppCompatDelegate.setDefaultNightMode(
            if (userPrefModeIsNight)
                AppCompatDelegate.MODE_NIGHT_YES
            else
                AppCompatDelegate.MODE_NIGHT_NO)