如果夜间模式为ON,我想在我的活动中选择不同的布局。
我做了什么:
为night
和notnight
添加了单独的布局文件夹,如下所示:
res
-----layout-night
----------my_layout.xml
-----layout-notnight
----------my_layout.xml
现在,当我切换夜间模式并重新打开应用程序时,我希望布局会改变,但它不会。
这需要额外的工作吗?
我需要添加权限才能使用吗?如果是,哪一个?
不寻找替代方法。我的用例特别需要根据夜间模式状态选择布局。我试图弄清楚为什么在文件夹到位时没有自动选择正确的布局。
更新:缩小了问题范围。总是挑选布局layout-notnight
。因此,文件夹结构工作正常。应用程序无法检测夜间模式。 (夜间模式在设备上切换为开启 - 尝试打开和关闭它在设备上工作,但应用程序无法检测到)
现在的问题是:
它是否需要能够检测夜间模式的状态?喜欢检测wifi状态和网络状态。
答案 0 :(得分:1)
您可以尝试使用make
。它提供方法UiModeManager
和setNightMode()
。也许它没有解决问题,但这是做到这一点的方法。
答案 1 :(得分:1)
在API 22及更低版本中,对夜间模式的更改仅在以下情况下有效 在设备上启用汽车或桌面模式。从API 23开始, 改变夜间模式总是有效的。
MODE_NIGHT_AUTO 会根据设备的当前位置和其他某些内容自动在夜晚和非夜晚之间切换 传感器
来自here(请注意 BOLD 文字):
如果是夜间模式,这可能会在您的应用程序生命周期内发生变化 在自动模式下保留(默认),在这种情况下模式会根据更改而改变 一天中的时间 。
因此,您可以尝试将设备时间调整为适当的值。
但请注意,夜间模式检测也可能依赖于其他某些传感器(开发者网站没有明确说明)。猜猜可能会考虑光传感器。
答案 2 :(得分: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);
同样,您可以使用此方法更改布局。