Вот как выглядит моя вкладка настроек (фрагмент) до того, как будут сделаны какие-либо выборки:
Из основного фрагмента пользователь может сделать выбор из счетчика -- выглядит следующим образом (после того, как пользователь сделал выбор):
Когда пользователь делает этот выбор, загружаются ранее выбранные пользователем варианты, сохраненные в пользовательских настройках, и устанавливаются соответствующие флажки. Флажки, которые были показаны на первом снимке, теперь выглядят следующим образом:
Видите, элементы, для которых теперь установлены флажки розового цвета? Эти элементы становятся розовыми, но галочка почему-то не отображается на Nougat. Эти элементы на самом деле выбраны, потому что если я нажму на них один раз, они станут невыбранными.
Lollipop работает, как и ожидалось Однако, если я запускаю программу на Lollipop, элементы отображаются полностью выбранными (с установленными флажками), как и ожидалось.
Ручная установка их в Nougat работает. Кроме того, если я вручную устанавливаю их (нажимаю на них во время работы приложения) в Nougat, тогда все другие элементы, выбранные в счетчике, работают должным образом, пока приложение продолжает работать. .
Вот основы того, что происходит для тех, кто хочет настроиться:
Когда элемент выбран в Spinner, я получаю rootview и вызываю findViewById()
addCharsTabCheckBox = (CheckBox)rootView.findViewById(R.id.addCharsTabCheckBox);
maxLengthTabCheckBox = (CheckBox)rootView.findViewById(R.id.maxLengthTabCheckBox);
После этого я просто вызываю setChecked() для каждого CheckBox:
addCharsTabCheckBox.setChecked(currentSiteKey.isHasSpecialChars());
Вы случайно не знаете, почему это может происходить?
Вы видели такое частичное поведение раньше?
Редактировать #1 Во время работы я также обнаружил, что невыбранные элементы будут отображаться так, как если бы они были частично выбраны (флажки, но серые) и выглядеть следующим образом:
Эти серые элементы не на самом деле выбраны. Кроме того, если я изменяю ориентацию устройства при просмотре этого фрагмента настроек, флажки перерисовываются (очевидно) и отображаются не отмеченными, как и ожидалось.
Редактировать №2
Только что протестировано на Marshmallow, и он работает правильно (или, как и ожидалось) на этом уровне API.
ИЗМЕНИТЬ 3
Я создал упрощенный проект на основе шаблона TabPage, предоставленного Android Studio 2.3.3, чтобы более подробно изучить эту проблему.
Общедоступный проект GitHub
Я добавил код в общедоступный репозиторий GitHub, чтобы вы могли получить его и попробовать: https://github.com/raddevus/CheckBoxFragTest
Проект немного отличается от приведенного выше, но оба они основаны на шаблоне, предоставленном Android Studio 2.3.3. Тестовый проект включает в себя 3 вкладки, поэтому я мог выяснить, увижу ли я такое же странное поведение на всех вкладках. СПОЙЛЕР: я этого не делал.
Вот как выглядит приложение на первой вкладке:
Две самые интересные части
Когда вы нажимаете кнопку [Toggle Checkbox] на вкладке Page 1, она вызывает setChecked для двух флажков (1 флажок на tabPage2 и 1 флажок на tabPage3).
Когда вы нажимаете кнопку на TabPage3, он устанавливает флажок, показанный на tabPage1 (см. выше на изображении).
Проблема
В Nougat, когда вы нажимаете кнопку [Toggle Checkbox] на TabPage1, он устанавливает флажок на tabPage2 в странное состояние, которое мы видели в исходном отчете о проблеме. Однако флажок на tabPage3 установлен и полностью проверен, как вы ожидаете.
ИЗМЕНИТЬ 4
Oreo Android v8.0 API уровня 26
У меня больше данных. Я только что запустил приложение на Oreo (эмулятор) и вижу там ту же проблему. Вот версия, на которой я работал:
Вот как это выглядит, когда я впервые нажимаю кнопку [Toggle Checkbox].
Но обратите внимание, что флажок на tabpage3 на самом деле установлен правильно, даже если он установлен из того же статического логического значения:
Если вы нажмете кнопку [Toggle Checkbox] во второй раз, вы получите странное состояние серого флажка (который на самом деле не выбран.
Однако флажок на tabpage3 фактически не установлен, как и должно быть.
И теперь, если вы снова нажмете [Toggle Checkbox], он правильно установит флажок на tabPage2 и будет работать правильно, пока приложение будет работать после этого.
jumpDrawablesToCurrentState()
сразу после вызоваsetChecked(true)
решает проблему и показывает правильное состояние. Похоже на баг анимации. - person Dalmas   schedule 08.12.2017