为什么在调用setChecked(false)时检查checkBox

时间:2017-02-16 17:29:34

标签: android checkbox onsaveinstancestate

有一些动态膨胀/添加的复选框,当选中一些旋转或最小化应用程序时(为了便于触发案例,打开“不要让活动保持活动状态”),恢复的UI视图显示所有复选框已选中。

当我们执行saveInstance时,我们将检查的项目存储在一个列表中,当要恢复片段的操作系统时,我们获取已检查项目的列表,当重新膨胀复选框时,它调用setChecked(true)或setChecked(false) )基于列表。 但在此之后,所有复选框都显示为已选中,尽管在调试中它清楚地显示只有已选中的复选框才会使用' true'和其他人使用' false'使用setChecked()。

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

itemList = [A,B,C,D,E]

checkedListSet = [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>

3 个答案:

答案 0 :(得分:0)

checkedListSet.get(item) != null

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

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

因此,每次此表达式返回true时,您的复选框将被设置为true。

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

答案 1 :(得分:0)

仍然不确定原因,但放入android后:saveEnabled =&#34; false&#34;相同的代码开始工作。有谁知道为什么它必须有android:saveEnabled =&#34; false&#34;?

<CheckBox
        android:saveEnabled="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        />

答案 2 :(得分:0)

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

android:saveEnabled标志告诉Android系统是否保存其状态并尝试稍后恢复。

由于您已经有适当的机制将状态设置android:saveEnabled恢复为false,因此无效。

EditTextWhy does Android change the value of EditTexts with same id?

发生类似情况的情况下,请参阅此问题