Android CheckBox在恢复片段状态时不监听OnCheckedChangeListener

时间:2019-01-16 09:18:33

标签: android android-fragments

在我的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再次被调用。我认为这是因为片段 已从保存状态还原。如何预防呢?

2 个答案:

答案 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.