0

在检查一些旋转或最小化应用程序时,有几个动态膨胀/添加的复选框(为了易于触发案例,打开“不要保持活动活力”)时,已修复的UI视图显示了所有复选框。

当 os 执行 saveInstance 时,我们将选中的项目存储在列表中,当操作系统恢复片段时,我们得到选中项目的列表,当重新膨胀复选框行时,它调用 setChecked(true) 或 setChecked(false)名单。但是在那之后所有的复选框都显示为选中,尽管在调试中它清楚地显示只有选中的那些被使用'true'而其他的被使用'false'和setChecked()。

任何人都经历过同样的事情,或者知道为什么单个 checkBox 实例上的 setChecked() 不执行所谓的操作?

项目列表 = [A、B、C、D、E]

已检查列表集 = [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

3 回答 3

2

检查所有复选框的原因是它们都具有相同的id. 如果其中任何一个被选中并被重新创建(由于方向更改或重新附加片段),Android 系统会尝试恢复它们的状态并根据它们的 id 识别它们。因此,所有这些都得到检查。

android:saveEnabledflag 告诉 Android 系统是否保存它们的状态并在以后尝试恢复。

由于您已经有一种机制可以将它们的状态设置恢复android:saveEnabled为 false 为您工作。

看到这个问题发生了类似的事情EditText为什么 Android 会改变具有相同 id 的 EditTexts 的值?

于 2017-02-18T11:36:14.550 回答
0
checkedListSet.get(item) != null

如果您的列表中有一个项目并且它不为空,则此方法将返回 true。

您正在将此表达式的结果分配给您的 isChecked 布尔值。

因此,每次该表达式返回 true 时,您的复选框都会被 setChecked true。

在设置复选框之前,我不知道您要检查的确切条件,所以我无法帮助您。

于 2017-02-16T17:38:36.490 回答
0

仍然不知道为什么,但在放入 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"
        />
于 2017-02-18T02:27:24.183 回答