You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Xamarin应用修改Android设备系统深色模式设置?

嘿,刚接触移动开发的话,这个问题其实挺常见的,我来给你一步步讲清楚~

能不能修改Android系统的DarkMode?

当然可以,但有个关键限制:只有Android 10(API Level 29)及以上的系统才支持通过代码切换系统级的深色模式。低于这个版本的系统没有统一的系统深色模式设置,只能针对你的应用自身切换主题,没法改动系统全局设置。

针对你的Xamarin项目的具体实现步骤

下面就基于你提供的代码,修改EnableSwitchChanged()方法,实现真正的系统DarkMode切换:

1. 先添加必要的权限

首先得在AndroidManifest.xml里加上修改系统设置的权限,因为改动系统设置属于敏感操作:

<uses-permission android:name="android.permission.WRITE_SETTINGS"
    android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
    android:protectionLevel="signature|preinstalled|appop" />

2. 处理特殊权限的授权

WRITE_SETTINGS不是普通权限,没法通过弹窗直接申请,得引导用户跳转到系统设置页面手动授权。在你的MainActivity里加两个辅助方法:

private bool CanWriteSettings()
{
    if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
    {
        return Android.Provider.Settings.System.CanWrite(this);
    }
    // 低于API23的系统默认允许,不过我们主要针对API29+,这里做个兼容
    return true;
}

private void RequestWriteSettingsPermission()
{
    if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
    {
        Intent intent = new Intent(Android.Provider.Settings.ActionManageWriteSettings);
        intent.SetData(Android.Net.Uri.Parse($"package:{PackageName}"));
        StartActivity(intent);
    }
}

3. 修改开关触发方法,实现切换逻辑

现在把你的EnableSwitchChanged()方法改成这样,就能真正切换系统DarkMode了:

protected void EnableSwitchChanged()
{
    // 先检查有没有修改系统设置的权限
    if (!CanWriteSettings())
    {
        RequestWriteSettingsPermission();
        Toast.MakeText(this, "需要授权修改系统设置才能切换深色模式哦", ToastLength.Long).Show();
        // 把开关切回去,因为还没授权,没法生效
        enableSwitch.Checked = !enableSwitch.Checked;
        return;
    }

    // 只在API29+的系统上执行切换
    if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
    {
        // 根据开关状态设置对应的夜间模式值
        int targetUiMode = enableSwitch.Checked ? (int)Android.Content.Res.UiMode.NightYes : (int)Android.Content.Res.UiMode.NightNo;
        
        // 更新当前应用的配置
        Android.Content.Res.Configuration config = Resources.Configuration;
        config.UiMode = (Android.Content.Res.UiMode)targetUiMode;
        Resources.UpdateConfiguration(config, Resources.DisplayMetrics);
        
        // 把设置保存到系统,这样重启设备后也能保持状态
        Android.Provider.Settings.System.PutInt(ContentResolver, 
            Android.Provider.Settings.System.UiModeNightMode, 
            targetUiMode);
    }
    else
    {
        Toast.MakeText(this, "当前系统版本不支持系统级深色模式切换", ToastLength.Long).Show();
        // 恢复开关状态
        enableSwitch.Checked = !enableSwitch.Checked;
    }
}

4. 可选:让开关初始状态和系统一致

为了用户体验更好,可以在OnCreate()里初始化开关状态,让它和当前系统的DarkMode保持同步:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    SetContentView(Resource.Layout.activity_main);

    enableSwitch = FindViewById<Switch>(Resource.Id.enableSwitch);
    enableSwitch.CheckedChange += delegate { EnableSwitchChanged(); };

    // 初始化开关状态为当前系统的DarkMode状态
    if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
    {
        int currentNightMode = Android.Provider.Settings.System.GetInt(ContentResolver, 
            Android.Provider.Settings.System.UiModeNightMode, 
            (int)Android.Content.Res.UiMode.NightNo);
        enableSwitch.Checked = currentNightMode == (int)Android.Content.Res.UiMode.NightYes;
    }
}
一些要注意的点
  • 版本兼容性:一定要记得判断API版本,低于29的系统别去调用这些方法,不然会报错。
  • 厂商限制:部分国产厂商可能对系统设置修改有额外的限制,最好在不同设备上测试一下。
  • 权限失效:如果用户后来在系统设置里取消了授权,你的切换逻辑会失效,所以每次触发都要检查权限。

内容的提问来源于stack exchange,提问作者Eishknaar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:18:12