Android复选框在恢复片段状态时不会监听OnCheckedChangeListener。

3

在我的安卓应用中,我有碎片,并且在其中一个碎片中,我有一个复选框。 这个复选框有一个监听器,当选中时会显示警示对话框:

@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会再次被调用。我认为这是因为片段保存状态中恢复过来了。如何避免这种情况发生?

2个回答

2

当用户触摸您的复选框时,您应该检测到,并且只有在触摸复选框时才处理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;
        }
    }
});

2
在您的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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接