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 上的 [切换复选框] 按钮时,它会在两个复选框(tabPage2 上的 1 个复选框和 tabPage3 上的 1 个复选框)上调用 setChecked
当您单击 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();
这是我的设置选项卡(片段)在制作任何 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 上的 [切换复选框] 按钮时,它会在两个复选框(tabPage2 上的 1 个复选框和 tabPage3 上的 1 个复选框)上调用 setChecked
当您单击 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();