【问题标题】:Night Mode state not detected in app - even when toggled ON应用程序中未检测到夜间模式状态 - 即使切换为 ON
【发布时间】:2016-07-08 20:26:08
【问题描述】:

如果夜间模式开启,我想在我的活动中选择不同的布局。

我做了什么:

nightnotnight 添加了单独的布局文件夹,如下所示:

res
-----layout-night
----------my_layout.xml

-----layout-notnight
----------my_layout.xml

现在,当我切换夜间模式并重新打开应用程序时,我希望布局会改变,但事实并非如此。

这需要额外的东西吗?

我需要添加权限才能使其正常工作吗?如果有,是哪一个?

不寻找替代方法。我的用例特别需要根据夜间模式状态选择布局。我试图弄清楚为什么当文件夹就位时没有自动选择正确的布局。


更新:缩小问题范围。布局layout-notnight 总是被选中。因此,文件夹结构工作正常。应用程序无法检测到夜间模式。 (夜间模式在设备上打开 - 尝试打开和关闭它在设备上工作但应用程序不会检测到)

所以现在的问题是:

是否需要权限才能检测夜间模式的状态?就像它需要检测 wifi 状态和网络状态一样。

【问题讨论】:

  • 你不能把它们放在同一个文件夹里,只用'day'和'night'作为后缀,然后在onCreate使用setContentView选择合适的吗?
  • 不,我知道我可以那样做。但这不是我的用例。主要目的是根据夜间模式的状态改变布局。
  • 好吧,对不起。我意识到你正在尝试做的事情 - 类似于 android 对 mdpihdpixhdpi 等所做的事情。也许你可以找出它是如何完成的并尝试模仿它?
  • 不需要模仿,文档说支持。因此好奇:) developer.android.com/guide/topics/resources/…
  • 啊,我明白了。您能否通过使用getNightMode() 并记录值来验证夜间模式是否已激活?

标签: android android-studio android-configchanges android-night-mode


【解决方案1】:

您可以尝试使用UiModeManager。它提供方法setNightMode()getNightMode()。也许它不能解决问题,但这是解决问题的方法。

【讨论】:

  • 感谢您的回复。我知道。但我基本上是想找出为什么正确的布局不会被自动拾取。
  • 您是否尝试在代码中使用UiModeManager.setNightMode(MODE_NIGHT_AUTO)
  • 我正在使用 Cyanogenmod 13。我可以从快速设置中切换它。
  • 看看这篇文章中的 cmets:stackoverflow.com/questions/5002931/… 这听起来很奇怪,但只有当 android 处于汽车模式时才可以使用夜间/非夜间模式。
  • 抱歉,之前没有在评论中尝试您的第一个建议。现在做了。结果表明该应用程序没有检测到夜间模式,尽管在设备上该模式已打开,并且我可以在打开时在屏幕上看到不同的色调。
【解决方案2】:

documentation 说:

在 API 22 及更低版本中,对夜间模式的更改仅在以下情况下有效 在设备上启用汽车或桌面模式。从 API 23 开始, 更改夜间模式总是有效的。

MODE_NIGHT_AUTO 根据设备的当前位置和某些其他位置自动在夜间和非夜间切换 传感器

来自here(注意BOLD文字):

如果夜间模式启用,这可能会在应用程序的生命周期内发生变化 留在自动模式(默认),在这种情况下,模式会根据 一天中的时间

所以你可以尝试将设备时间调整到合适的值。

但也请注意,夜间模式检测也可能取决于其他某些传感器(开发者网站没有明确说明)。猜猜可能会考虑光传感器。

【讨论】:

  • 我在 API 级别 23 上并尝试了所有设置 - 自动和夜间显式。应用程序只是不会检测到。您说检测将取决于哪些其他因素?
  • 一些特定的传感器,但文档没有指定它将使用哪个传感器
  • 但是您知道哪些传感器吗?此信息是否有外部来源/参考?
  • 您可以阅读android.stackexchange.com/questions/83810/… 中接受的答案作为附加信息。你的问题的答案,对不起,我不知道。
【解决方案3】:

如果您使用切换按钮或复选框,那么您可以在 SharedPreferences 中存储一个布尔值,并可以使用它来检查用户是否想要夜间模式。即使在应用程序关闭并再次使用后,这仍然有效。

CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        SharedPreferences sharedPreferences = getSharedPreferences("MyData", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            editor.putBoolean("dark", isChecked);
            editor.commit();
        }
    });

然后,在下一个活动中

 SharedPreferences preferences = getSharedPreferences("MyData", Context.MODE_PRIVATE);
    listView = (ListView) findViewById(R.id.listView);
    ArrayAdapter<String> adapter;
    if(preferences.getBoolean("dark",false) == true)
        adapter = new ArrayAdapter<String>(this,R.layout.list_item_dark,name);
    else
        adapter = new ArrayAdapter<String>(this,R.layout.list_item,name);

同样,您可以使用此方法更改布局。

【讨论】:

  • 感谢您的回复,但解决方法不是我想要的。我知道如何获得解决方法。我正在寻找的答案是当夜间模式在设备级别打开时,为什么应用程序不会检测到它......
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多