应用程序未检测到夜间模式状态 - 即使已切换为“开启”。

3
如果夜间模式开启,我想要在我的活动中选择不同的布局。
我已经完成的工作:
添加了分别命名为“night”和“notnight”的布局文件夹。
res
-----layout-night
----------my_layout.xml

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

现在,当我切换夜间模式并重新打开应用程序时,我希望布局会改变,但实际上并没有改变。
这需要额外的一些东西才能生效吗?
我需要添加权限才能使其生效吗?如果是,是哪一个权限? 我不想使用其他方法。我的用例需要根据夜间模式状态选择布局。我正在尝试弄清楚为什么正确的布局没有被自动选择,当文件夹已经准备好了。
更新:问题已经缩小范围。总是选择布局layout-notnight,因此,文件夹结构正常工作。应用程序无法检测到夜间模式。(设备上切换夜间模式开关可以工作,但应用程序不能检测)。
所以问题是:
是否需要权限才能检测夜间模式的状态?就像它需要检测wifi状态和网络状态一样。

啊,好的,抱歉。我明白你想做什么了——类似于 Android 中使用 mdpihdpixhdpi 等等的方式。也许你可以找出这是如何实现的,并尝试模仿一下? - Vucko
@Vucko:是的,你说得对。 - Viral Patel
1
不需要模仿,文档中说它被支持。因此产生了好奇心 :) https://developer.android.com/guide/topics/resources/providing-resources.html - Viral Patel
1
啊,我明白了。你能否通过使用 getNightMode() 并记录其值来验证夜间模式是否已激活? - Vucko
很好的发现,我尝试了一下,它说不在夜间模式。虽然实际上它确实处于夜间模式。感谢您缩小了问题范围。现在需要集中精力解决应用程序无法检测到它处于夜间模式的原因。 - Viral Patel
显示剩余4条评论
3个回答

1
你可以尝试使用 UiModeManager。它提供了 setNightMode()getNightMode() 方法。也许不能完全解决问题,但这是一种方法。

谢谢您的回复。我知道这一点。但是我基本上想知道为什么正确的布局不会自动被选中。 - Viral Patel
你在代码中尝试使用 UiModeManager.setNightMode(MODE_NIGHT_AUTO) 了吗? - Vladislav Sazanovich
我正在使用Cyanogenmod 13。我可以从快速设置中切换它。 - Viral Patel
请查看此帖子的评论:http://stackoverflow.com/questions/5002931/change-mode-of-android-phone-as-day-night-automatic?rq=1 听起来很奇怪,但只有当Android处于车载模式时才有夜间/非夜间模式可用。 - Vladislav Sazanovich
抱歉,之前没有尝试您在评论中提出的第一个建议。现在已经尝试了,结果发现应用程序无法检测到夜间模式,尽管设备上已经开启了该模式,并且我可以看到屏幕上的色调变化。 - Viral Patel
也许这是我最后一次尝试...(我真的不知道) 只是为了实验。将不同的my_layout.xml放入布局文件夹中,看看会发生什么。 - Vladislav Sazanovich

1

文档中提到:

在API 22及以下版本上,只有在设备启用车载或桌面模式时,夜间模式的更改才会生效。从API 23开始,夜间模式的更改总是有效。

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

来自这里(注意粗体文字):

如果将夜间模式保留在自动模式(默认情况下),则此情况可能会在应用程序的生命周期内发生更改,在这种情况下,模式会基于当天时间而更改。

因此,您可以尝试将设备时间调整为适当的值。

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


我正在使用API Level 23,并尝试了所有设置 - 自动模式和夜间模式。应用程序仍然无法检测到。您说检测将依赖于哪些其他因素? - Viral Patel
有一些特定的传感器,但文档没有指明将使用哪种传感器。 - suitianshi
但你知道是哪些传感器吗?有没有外部来源或参考资料提供这方面的信息? - Viral Patel
你可以阅读http://android.stackexchange.com/questions/83810/what-is-android-night-mode-what-triggers-it-and-what-are-the-consequences中的被接受的答案作为额外信息。至于你的问题的答案,抱歉,我不知道。 - suitianshi

0
如果您正在使用切换按钮或复选框,则可以将布尔值存储在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);

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

谢谢回复,但是绕过并不是我想要的。我知道如何获取绕过方法。我想要的答案是,当设备处于夜间模式时,为什么应用程序无法检测到它... - Viral Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接