2017-04-06 80 views
1

我的活动中有一个切换按钮。当开关打开时,它显示启用对话框并且开关关闭,它显示禁用对话框。在取消对话框中恢复切换按钮的状态

((SwitchCompat) findViewById(R.id.toggleButton)).setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked){ 
       ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("on"); 
       showEnableSharingDialog(); 
      } else { 
       ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("off"); 
       showDiasableShareingDialog(); 
      } 
     } 
    }); 

这是使对话框:

private void showEnableShareingDialog() { 
    final CharSequence options[]= getResources().getStringArray(R.array.sharing_options); 
    AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this); 

    builder.setTitle(getString(R.string.you_want_to_enable_prev_sigtings)); 

    builder.setItems(options, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      if(which==0){ 
       mShareSigtings=true; 
       mEnableShareing=true; 
       updateSettings(); 
      } else if(which==1){ 
       mShareSigtings=true; 
       mEnableShareing=false; 
       updateSettings(); 
      } else { 
       /*---todo---*/ 
       dialog.cancel(); 
      } 
     } 
    }); 
    builder.show(); 
} 

这是禁用的对话框:

private void showDiasableShareingDialog() { 
    final CharSequence options[]= getResources().getStringArray(R.array.remove_sharing_options); 
    AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this); 

    builder.setTitle(getString(R.string.you_want_to_remove_prev_sigtings)); 

    builder.setItems(options, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      if (which == 0) { 
       mShareSigtings = false; 
       mRemovePrevSigtings = true; 
       updateSettings(); 
      } else if (which == 1) { 
       mShareSigtings = false; 
       mRemovePrevSigtings = false; 
       updateSettings(); 
      } else { 
       /*---todo---*/ 
       dialog.cancel(); 
      } 
     } 
    }); 
    builder.show(); 
} 

在这两个对话框,切换按钮开关实施国家即说拨动是ON状态,那么我按下按钮,弹出对话框,当我按下CANCEL时,它将从ON变为OFF状态。预期的结果是当按下CANCEL时,切换按钮应保持在其原始位置,即如果切换为ON,则在按下CANCEL时它应保持ON。我将如何实现这种操作?

此外,如果我做下面的事情,两个对话框不断弹出按下CANCEL。

if(((SwitchCompat)findViewById(R.id.toggle3)).isChecked()){ 
        ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false); 
}else { 
        ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true); 
} 
+0

您的setOnChangeListener条件引起的问题。当通过.setChecked编程切换开关的代码被调用时,它被触发。 –

回答

1

你必须知道:

  • onCheckedChanged被调用后的SwichCompat的状态变化。
  • 如果添加了OnCheckedChangeListener您SwitchCompat,这个监听器将(通过代码或通过手动按下)

所以,快速修复此的SWICH状态的任何更改后触发的,在你面前将swich set null的检查状态更改为onCheckedChanged,然后再次放置侦听器。这里有一个例子:

SwitchCompat mySwich = ((SwitchCompat) findViewById(R.id.toggleButton)) 
    OnCheckedChangeListener listener = new OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        if(isChecked){ 
         ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("on"); 
         showEnableSharingDialog(); 
        } else { 
         ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("off"); 
         showDiasableShareingDialog(); 
        } 
       } 
      }; 
mySwitch.setOnCheckedChangeListener(listener); 

并在您取消回调,你可以做这样的事情:当你设置开关切换

mySwitch.setOnCheckedChangeListener(null); 
if(((SwitchCompat)findViewById(R.id.toggle3)).isChecked()){ 
        ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false); 
}else { 
        ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true); 
} 
mySwitch.setOnCheckedChangeListener(listener); 
+0

感谢您的帮助这样做解决了我的问题 – Raj

+0

好,然后让它成为一个公认的答案:) –

0

else { 
 
    /*---todo---*/ 
 
    dialog.cancel(); 
 
}

每个那些其他代码上面标志着取消其落在 “别人” 为你的情况采取行动 - 您可以添加

((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false); 

((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true); 

以下/ ---待办事项--- /评论和恰好在您之前dialog.cancel();

+0

我是否必须将它添加到对话框或其中的任何一个? – Raj

+0

@Raj尝试一个或两个。 –

+0

我试着按照你说的,事实证明它失败的条件之一取决于你把它放在哪里也对话显示两次 – Raj