Switch使用setChecked进行循环

时间:2016-12-12 16:38:38

标签: android alertdialog

我有一个发送短信的开关。

  • 如果禁用,则发送启用短信
  • 如果启用,则发送禁用短信

在发送此短信之前,会出现一个alertDialog,要求用户确认是否要进行更改。

如果用户选择“确定”,则发送消息并取消alertDialog。

如果用户选择“否”,则取消alertDialog。但是开关之前已经改变了它的状态,所以它应该返回到先前的状态。我知道这样做的唯一方法就是使用switch.setChecked(boolean),问题是如果我使用它,那么交换机会进入一个循环并且一直向我显示带有启用或禁用选项的alertDialog。

这是代码:

    switch_1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
            if (isChecked) {
                new_state = 1;
            }else {
                new_state = 0;
            }
            AlertDialog.Builder builder =
                    new AlertDialog.Builder(getActivity());
            builder.setNegativeButton(R.string.btncancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (new_state == 1) {
                        new_state = 0;
                        switch_1.setChecked(false);
                    }else {
                        new_state = 1;
                        switch_1.setChecked(true);
                    }
                }
            });
            builder.setPositiveButton(R.string.btnaccept, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    ((MainActivity)getActivity()).sendCommand(new_state);
                }
            });
            builder.show();
        }
    });

此代码位于片段内。所以基本上我想知道如果用户按下负按钮,如何将开关返回到之前的状态,而不进入此循环。

1 个答案:

答案 0 :(得分:1)

这是因为当您调用setChecked方法时,您还在调用onCheckedChanged listener

要避免循环,请添加另一个助手boolean

boolean isAutomaticallyChanged = false;

以编程方式更改switch的状态后,请添加以下代码:isAutomaticallyChanged = true;

最后添加您的listener代码:

if(isAutomaticallyChanged){
  isAutomaticallyChanged = false;
  return;
}

因此,当您以编程方式更改开关的值时,程序将不会运行完整方法。

希望这有帮助

我会在此处添加您编辑过的代码

boolean isAutomaticallyChanged = false;
switch_1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
         if(isAutomaticallyChanged){
           isAutomaticallyChanged = false;
           return;
         }
        if (isChecked) {
            new_state = 1;
        }else {
            new_state = 0;
        }
        AlertDialog.Builder builder =
                new AlertDialog.Builder(getActivity());
        builder.setNegativeButton(R.string.btncancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (new_state == 1) {
                    new_state = 0;
                    isAutomaticallyChanged = true;
                    switch_1.setChecked(false);

                }else {
                    new_state = 1;
                    isAutomaticallyChanged = true;
                    switch_1.setChecked(true);
                }
            }
        });
        builder.setPositiveButton(R.string.btnaccept, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                ((MainActivity)getActivity()).sendCommand(new_state);
            }
        });
        builder.show();
    }
});