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

Android Nougat: Why do checkboxes on Fragment have incomplete state when selected programmatically (but look fine on Lollipop)

这是我的设置选项卡(片段)在制作任何 select离子之前的样子:

用户可以从主片段中从微调器创建一个 selection -- 如下所示(在用户做出选择后):

当用户做出该 selection 时,用户先前选择的选项将被加载,这些选项保存在用户首选项中,并且相应的复选框会被 selected。第一个快照中显示的复选框现在如下所示:

看到了吗,现在关联复选框设置为粉红色的项目?这些项目变成粉红色,但由于某种原因在牛轧糖上未显示支票。 这些项目实际上是 selected,因为如果我单击它们一次,它们就会变成未selected。

棒棒糖按预期工作 但是,如果我 运行 Lollipop 上的程序,项目会按预期完全显示 selected(选中复选框)。

在 Nougat Works 上手动设置它们 此外,如果我在 Nougat 上手动设置它们(在应用程序处于 运行ning 时单击它们),那么当应用程序继续 运行.[=25 时,它会在微调器中选择的所有其他项目按预期工作=]

以下是需要设置的基础知识:

当项目在 Spinner 中 selected 时,我得到根视图并调用 findViewById()

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

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

addCharsTabCheckBox.setChecked(currentSiteKey.isHasSpecialChars());

你知道为什么会这样吗?

您以前见过这种部分行为吗?

编辑#1 虽然 运行ning 我还发现未 selected 的项目将显示为好像它们是部分 selected(复选框但灰色)并且如下所示:

那些灰色项目 不是 实际上 select 编辑的。 此外,如果我在查看该设置片段时更改设备方向,则复选框将被重绘(显然)并按预期显示 unchecked

编辑 #2

刚刚在 Marshmallow 上进行了测试,它在 API 级别上也能正常工作(或符合预期)。


编辑 3

我根据Android Studio 2.3.3 提供的TabPage 模板创建了一个简化的项目,以便更深入地研究这个问题。

Public GitHub 项目

我已将代码添加到 public GitHub 存储库中,您可以获取并试用: https://github.com/raddevus/CheckBoxFragTest

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

这是第一个标签页上的应用程序的样子:

最有趣的两个部分

  1. 当您点击选项卡页面 1 上的 [切换复选框] 按钮时,它会在两个复选框(tabPage2 上的 1 个复选框和 tabPage3 上的 1 个复选框)上调用 setChecked

  2. 当您单击 TabPage3 上的按钮时,它将设置 tabPage1 上显示的复选框(如上图所示)。

问题

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

编辑 4

奥利奥Androidv8.0API26级

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

这是我第一次单击 [切换复选框] 按钮时的样子。

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

如果您再次单击 [切换复选框] 按钮,您将获得奇怪的灰色复选框状态(实际上未select编辑。

但是,tabpage3 上的复选框实际上未select按应有的方式编辑。

现在,如果您再次单击 [切换复选框],那么它将 select tabPage2 上的复选框正常工作,并且只要此应用 运行 秒后它就会正常工作。

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

之后调用此 jumpDrawablesToCurrentState()

在我的案例中对我有用的代码


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

RadioButton radioButton = (RadioButton)  clView; 
radioButton.setChecked(true);
radioButton.jumpDrawablesToCurrentState();