Состояние ночного режима не обнаружено в приложении — даже при включении

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

Что я сделал:

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

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

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

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

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

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

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


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

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

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


person AndroidMechanic - Viral Patel    schedule 08.07.2016    source источник
comment
Разве вы не можете поместить их в одну папку и просто добавить к ним суффиксы «день» и «ночь», а затем в onCreate использовать setContentView, чтобы выбрать подходящий?   -  person Vucko    schedule 08.07.2016
comment
Нет, я знаю, что могу сделать это таким образом. Но это не мой вариант использования. Основное намерение состоит в том, чтобы изменить макет в зависимости от состояния ночного режима.   -  person AndroidMechanic - Viral Patel    schedule 08.07.2016
comment
А, ладно, извини. Я понимаю, что вы пытаетесь сделать - что-то похожее на то, что андроид делает с mdpi, hdpi, xhdpi и т. д. Может быть, вы можете узнать, как это делается, и попытаться имитировать это?   -  person Vucko    schedule 08.07.2016
comment
@Vucko: да, ты правильно понял   -  person AndroidMechanic - Viral Patel    schedule 08.07.2016
comment
не нужно имитировать, в документации сказано, что это поддерживается. Отсюда и любопытство :) developer.android.com/guide/topics/resources /   -  person AndroidMechanic - Viral Patel    schedule 08.07.2016
comment
Ах я вижу. Можете ли вы убедиться, что ночной режим активирован, используя getNightMode() и записав значение в журнал?   -  person Vucko    schedule 08.07.2016
comment
Хороший улов, я пробовал, и он говорит, что не в ночном режиме. Хотя на самом деле он в ночном режиме. Спасибо, что сузили проблемную область. Теперь нужно сосредоточиться на том, почему приложение не обнаруживает, что оно включено.   -  person AndroidMechanic - Viral Patel    schedule 09.07.2016
comment
есть ли шанс, что для добавления разрешения в манифест потребуется разрешение?   -  person AndroidMechanic - Viral Patel    schedule 09.07.2016
comment
Давайте продолжим обсуждение в чате.   -  person Vucko    schedule 09.07.2016


Ответы (3)


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

person Vladislav Sazanovich    schedule 08.07.2016
comment
Спасибо за ответ. Что я знаю. Но я в основном пытаюсь выяснить, почему правильный макет не будет выбран автоматически. - person AndroidMechanic - Viral Patel; 08.07.2016
comment
Вы пытались использовать UiModeManager.setNightMode(MODE_NIGHT_AUTO) в своем коде? - person Vladislav Sazanovich; 08.07.2016
comment
У меня Cyanogenmod 13. Я могу переключить его из быстрых настроек. - person AndroidMechanic - Viral Patel; 08.07.2016
comment
Посмотрите комментарии к этому сообщению: stackoverflow.com/questions/5002931/ Звучит странно, но ночной/не ночной режим доступен только в том случае, если Android находится в автомобильном режиме. - person Vladislav Sazanovich; 08.07.2016
comment
извините, не попробовал ваше первое предложение в комментарии ранее. Сделал сейчас. Оказывается, приложение не обнаруживает ночной режим, хотя на устройстве этот режим включен, и я вижу разницу в оттенке на экране, когда он включен. - person AndroidMechanic - Viral Patel; 09.07.2016
comment
Может быть, моя последняя попытка... (я действительно понятия не имею) Просто для эксперимента. Поместите разные my_layout.xml в папку макета и посмотрите, что происходит. - person Vladislav Sazanovich; 09.07.2016

В документации говорится:

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

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

И здесь (обратите внимание на выделенный жирным шрифтом текст):

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

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

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

person suitianshi    schedule 13.07.2016
comment
Я работаю на уровне API 23 и перепробовал все настройки - автоматические и ночные. Приложение просто не обнаружит. от каких других факторов, по вашему мнению, будет зависеть обнаружение? - person AndroidMechanic - Viral Patel; 13.07.2016
comment
Некоторые определенные датчики, но документ не указывает, какой датчик он будет использовать. - person suitianshi; 13.07.2016
comment
а вы знаете какие датчики? есть ли внешний источник/ссылка на эту информацию? - person AndroidMechanic - Viral Patel; 13.07.2016
comment
вы можете прочитать принятый ответ в android.stackexchange.com/questions/83810/ в качестве дополнительной информации. И ответ на ваш вопрос, извините, я не знаю. - person suitianshi; 13.07.2016

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

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

person Aman Vangani    schedule 16.07.2016
comment
Спасибо за ответ, но обходной путь не то, что я ищу. Я знаю, как найти обходные пути. Ответ, который я ищу, заключается в том, что когда ночной режим включен на уровне устройства, почему приложение не обнаруживает его... - person AndroidMechanic - Viral Patel; 18.07.2016