在我的Android应用中,我有片段,在其中一个片段中,我有复选框。 该复选框具有这样的侦听器,在选中时会显示警报对话框:
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if (isChecked) {
alertDialog.setPositiveButton(R.string.is_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
NItem item = new NItem();
item.isOk = 1;
setItem(item);
}
});
alertDialog.setNegativeButton(R.string.is_not_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
NItem item = new NItem();
item.isOk = 0;
setItem(item);
}
});
alertDialog.show();
}
}
当我选中复选框并转到其他片段并返回到片段时,在该复选框中,方法onCheckedChanged
再次被调用。我认为这是因为片段 已从保存状态还原。如何预防呢?
答案 0 :(得分:1)
您应该检测用户何时触摸您的复选框,并且仅在触摸复选框时处理onCheckedChanged()
。
这里是一个例子:
static Boolean isTouched = false;
yourCheckbox.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
isTouched = true;
return false;
}
});
//Listen to checked change, but only if the toggle is touched, not when initializing the toogle
yourCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if (isTouched) {
//Do your things
isTouched = false;
}
}
});
答案 1 :(得分:0)
在您的onCheckedChanged()
中,检查片段的isResumed()
,只有在它为true时才继续。这比检查视图是否被触摸要简单得多,它将涵盖您希望侦听器处理setChecked()
调用的所有情况。如果您不想让监听者接听这些电话,则可以在呼叫之前将其删除,然后再添加回去。
isResumed()
),则 mState >= RESUMED
返回true。在还原过程中调用onCheckedChanged()
时,它处于ACTIVITY_CREATED
状态。
以下是Fragment类的各种状态:
INITIALIZING = 0; // Not yet created.
CREATED = 1; // Created.
ACTIVITY_CREATED = 2; // Fully created, not started.
STARTED = 3; // Created and started, not resumed.
RESUMED = 4; // Created started and resumed.