Android Nougat:为什么在以编程方式选择时,Fragment上的复选框具有不完整状态(但在Lollipop上看起来很好)

问题描述 投票:11回答:1

以下是我的设置选项卡(片段)在进行任何选择之前的样子:

no selections

从主片段中,用户可以从Spinner中进行选择 - 如下所示(在用户做出选择之后):

super is selected

当用户进行该选择时,加载用户先前选择的用户首选项中保存的选项,并选择相应的复选框。现在,第一个快照中显示的复选框如下所示:

partially selected

请参阅,现在具有相关复选框的项目设置为粉红色?那些物品变成了粉红色但是由于某种原因在牛轧糖上没有显示支票。实际上选择了这些项目,因为如果我单击它们,那么它们将被取消选择。

Lollipop按预期工作但是,如果我在Lollipop上运行程序,则项目将按预期完全选中(选中复选框)。

在Nougat Works上手动设置它们另外,如果我在Nougat上手动设置它们(在应用程序运行时单击它们),那么它会在应用程序继续运行时按照预期在旋转器中选择的所有其他项目工作。

checkboxes are selected as expected

以下是设置内容的基础知识:

当在Spinner中选择项目时,我得到rootview并调用findViewById()

  addCharsTabCheckBox = (CheckBox)rootView.findViewById(R.id.addCharsTabCheckBox);
     maxLengthTabCheckBox = (CheckBox)rootView.findViewById(R.id.maxLengthTabCheckBox);

之后我只是在每个CheckBox上调用setChecked():

addCharsTabCheckBox.setChecked(currentSiteKey.isHasSpecialChars());

你会碰巧知道为什么会这样吗?

你以前见过这种局部行为吗?

编辑#1在运行时我还发现未选择的项目将显示为部分选中(复选框但灰色),如下所示:

unselected but checked

实际上没有选择那些灰色项目。此外,如果我在查看“设置”片段时更改设备方向,则复选框(显然)会重新绘制,并按预期显示未选中状态。

编辑#2

刚刚在Marshmallow上进行了测试,它在该API级别上也能正常工作(或正如预期的那样)。 marshmallow works also


编辑3

我已经基于Android Studio 2.3.3提供的TabPage模板创建了一个简化的项目,以便更密切地研究这个问题。

公共GitHub项目

我已将代码添加到公共GitHub仓库中,以便您可以获取并尝试:https://github.com/raddevus/CheckBoxFragTest

该项目与上述项目略有不同,但它们都基于Android Studio 2.3.3提供的模板。测试项目包括3个选项卡,因此我可以调查是否在所有选项卡页面上看到相同的奇怪行为。 SPOILER:我没有。

以下是该应用在第一个标签页中的外观:

tab page 1

两个最有趣的部分

  1. 单击选项卡页面1上的[切换复选框]按钮时,它将在两个复选框上调用setChecked(tabPage2上的1个复选框和tabPage3上的1个复选框)
  2. 当您单击TabPage3上的按钮时,它将设置tabPage1上显示的复选框(如上图所示)。

问题

在Nougat上,当您单击TabPage1上的[Toggle Checkbox]按钮时,它会将tabPage2上的复选框设置为奇怪状态,我们在原始问题报告中看到了。但是,tabPage3上的复选框已设置并完全按预期进行检查。

编辑4

Oreo Android v8.0 API等级26

我有更多的数据。我刚刚在Oreo(模拟器)上运行应用程序,我在那里看到了同样的问题。这是我运行的版本:

oreo version

这是我第一次点击[Toggle Checkbox]按钮时的样子。

partially-selected state Oreo

但是,请注意tabpage3上的复选框实际上是正确选择的,即使它是从相同的静态布尔值设置的:

tabpage3 checkbox - selected

如果再次单击[切换复选框]按钮,则会出现奇怪的灰色复选框状态(实际上是未选中状态)。

partially-selected unselected

但是,tabpage3上的复选框实际上是未选中的。

现在,如果再次单击[切换复选框],它将正确选择tabPage2上的复选框,只要应用程序在此之后运行,它将正常工作。

android android-fragments android-5.0-lollipop android-7.0-nougat android-checkbox
1个回答
1
投票

只需在调用jumpDrawablesToCurrentState()radioButton.setChecked(true)后调用此checkBox.setChecked(true);

在我的案例中为我工作的代码


CheckBox checkBox   = (CheckBox) clView;   
checkBox.setChecked(true);
checkBox.jumpDrawablesToCurrentState();

RadioButton radioButton = (RadioButton)  clView; 
radioButton.setChecked(true);
radioButton.jumpDrawablesToCurrentState();
© www.soinside.com 2019 - 2024. All rights reserved.