Почему checkBox проверяется при вызове setChecked(false)
Имея несколько динамически надуваемых / добавленных флажков, когда некоторые из них отмечены, поверните или сверните приложение (для простоты запуска дела включите "Не поддерживать активность"), восстановленное представление пользовательского интерфейса показывает все флажки, отмеченные флажком.
Когда мы делаем saveInstance, мы сохраняем отмеченные элементы в списке, а когда операционная система восстанавливает фрагмент, мы получаем список проверенных элементов, и при повторном заполнении строки флажка она вызывает либо setChecked(true), либо setChecked(false) на основе список. Но после этого все флажки отображаются как проверенные, хотя в отладке ясно видно, что только проверенные используются как "истина", а другие - как "ложь" с setChecked().
Кто-нибудь испытал то же самое, или знает, почему setChecked () на отдельном экземпляре checkBox не выполняет то, что вызывается?
itemList = [A, B, C, D, E]
checkListSet = [A, B]
void insertOneRow(ViewGroup container, Item item) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemLayout = inflater.inflate(R.layout.item_row, null, false);
TextView txt = (TextView)itemLayout.findViewById(R.id.text);
txt.setText(item.toString());
container.addView(itemLayout, container.getChildCount());
CheckBox checkbox = (CheckBox)itemLayout.findViewById(R.id.checkbox);
if (checkbox != null) {
boolean isChecked = (checkedListSet.get(item) != null);
Log.i(“insertOneRow(), isChecked:"+ isChecked +", item:”+item);
checkbox.setChecked(isChecked); //<== trace shows only A and B are set with true
}
}
item_row.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="36dp"
android:orientation="horizontal"
>
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:checked="false" />
<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
4 ответа
Причина, по которой все ваши флажки проверяются, заключается в том, что все они имеют одинаковые id
, Если один из них отмечен и он воссоздан (либо из-за изменения ориентации, либо из-за повторного присоединения фрагмента), система Android пытается восстановить их состояние и идентифицирует их по их идентификаторам. Следовательно, все они проверяются. Это ошибка в Android.
android:saveEnabled
Флаг сообщает системе Android, стоит ли сохранять их состояние и пытаться восстановить позже или нет.
Так как у вас уже есть механизм для восстановления их состояния android:saveEnabled
к ложным работам для вас.
Посмотрите на этот вопрос, где подобное происходит с EditText
: Почему Android меняет значение EditTexts с тем же идентификатором?
До сих пор не уверен, почему, но после того, как положить в Android:saveEnabled="false" тот же код начинает работать. кто-нибудь знает, почему у него должен быть android:saveEnabled="false"?
<CheckBox
android:saveEnabled="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
checkedListSet.get(item) != null
Этот метод вернет true, если в вашем списке есть элемент, и он не нулевой.
Вы присваиваете результат этого выражения вашему логическому значению isChecked.
Таким образом, каждый раз, когда это выражение возвращает значение true, ваш флажок будет установлен в значение true.
Я не знаю, какое именно состояние вы хотите проверить перед установкой флажка, поэтому я не могу вам с этим помочь.
Я сильно опоздал, но всё равно.
Все вышеперечисленное у меня не сработало, я думаю, что с этим классом "android.widget.CheckBox" что-то не так .
Вместо этого используйте что-нибудь другое, например «com.google.android.material.checkbox.MaterialCheckBox» .
Вместо :
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:checked="false"/>
Использовать:
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:checked="false"/>
После этого все функции работают.