38

我正在寻找一种使用 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);
    }
}

我的屏幕上没有任何变化,夜间模式仍处于禁用状态。根据这个链接

无需启用 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
4

5 回答 5

59

最简单的解决方案

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

  1. 启用深色主题:

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

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

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
    

笔记:

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

“主题.AppCompat.DayNight”

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

drawable & drawable-night,
values & values-night

于 2020-05-19T12:50:49.217 回答
16

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

于 2019-05-14T06:47:52.753 回答
4

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

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 中对我有用。

于 2021-03-07T00:04:09.783 回答
0

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);
    }
});
于 2017-11-26T12:16:25.427 回答
0

记住Dark Mode不是Night Mode。它们完全不同。DM 是在 Android 10 中引入的,它强制内置黑白颜色,而 NM 在早期版本上使用默认/自定义 m 样式,具体取决于您的实现。如果您希望您的应用程序使用您的自定义灯光/夜间样式而不依赖于 Android 的内置深色样式,您可能需要forceDarkAllowedfalseThemes.xml 或 style.xml 中,因为它可能与 DM 冲突。

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

// This will be the top level handling of theme
        AppCompatDelegate.setDefaultNightMode(
            if (userPrefModeIsNight)
                AppCompatDelegate.MODE_NIGHT_YES
            else
                AppCompatDelegate.MODE_NIGHT_NO)
于 2021-05-01T13:01:10.773 回答