3

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

我做了什么:

为 和添加单独的布局文件夹,night如下notnight所示:

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

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

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

这是否需要额外的东西才能工作?

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

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


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

所以现在的问题是:

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

4

3 回答 3

1

文档说:

在 API 22 及更低版本中,只有在设备上启用汽车或桌面模式时,对夜间模式的更改才有效。从 API 23 开始,对夜间模式的更改始终有效。

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

这里开始(注意粗体文本):

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

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

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

于 2016-07-13T07:29:52.943 回答
1

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

于 2016-07-08T20:32:26.870 回答
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);

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

于 2016-07-16T17:34:39.203 回答