Ночное состояние не обнаруживается в приложении, даже если оно включено

Если включен ночной режим, я хочу выбрать другой макет в своей деятельности.

Что я сделал:

добавлены отдельные макеты папок для night а также notnight следующее:

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

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

Теперь, когда я переключаю ночной режим и снова открываю приложение, я надеялся, что макет изменится, но это не так.

Есть ли что-то дополнительное, чтобы это работало?

Есть ли разрешение, которое мне нужно добавить, чтобы это работало? Если да, то какой?

Не ищу альтернативного подхода. Мой вариант использования требует, чтобы макет выбирался в зависимости от состояния ночного режима. Я пытаюсь выяснить, почему правильный макет не выбирается автоматически, когда папки на месте.


ОБНОВЛЕНИЕ: узкая проблема. Расположение layout-notnight выбирается всегда. Следовательно, структура папок работает нормально. Приложение не может обнаружить ночной режим. (Ночной режим включен на устройстве - попытался включить и выключить, он работает на устройстве, но приложение не обнаружит)

Итак, вопрос сейчас:

Требуется ли разрешение для определения состояния ночного режима? как это нужно для определения состояния Wi-Fi и состояния сети.

3 ответа

В документации сказано:

В API 22 и ниже изменения в ночной режим вступают в силу только в том случае, если на устройстве включен автомобильный или настольный режим. Начиная с API 23, изменения в ночной режим всегда эффективны.

MODE_NIGHT_AUTO автоматически переключается между ночью и ночью, исходя из текущего местоположения устройства и некоторых других датчиков

И отсюда(обратите внимание на жирный текст):

Это может измениться в течение срока службы вашего приложения, если ночной режим оставить в автоматическом режиме (по умолчанию), и в этом случае режим меняется в зависимости от времени суток.

Таким образом, вы можете попытаться настроить время устройства на правильное значение.

Но имейте в виду, что обнаружение ночного режима также может зависеть от других определенных датчиков (о которых сайт разработчика не говорит четко). Думаю, датчик света может быть принят во внимание.

Вы можете попробовать использовать UiModeManager, Это предоставить методы setNightMode() а также getNightMode(), Может быть, это не решит проблему, но это способ сделать это.

Если вы используете кнопку переключения или флажок, то вы можете сохранить логическое значение в 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);

Точно так же вы можете изменить макет, используя этот метод.

Другие вопросы по тегам