【问题标题】:Show an Alertdialog on Checkbox click在复选框单击时显示警报对话框
【发布时间】:2014-10-17 20:38:38
【问题描述】:

我有一个可以选中或不选中的复选框。当复选框被选中并且用户单击它时,我想显示一个 AlertDialog 而不取消选中该复选框(因为当您单击该复选框时,它会变为未选中状态,因为它只是跟随状态更改)。在 AlertDialog 中,我想询问用户是否真的要取消选中它,然后才将复选框设置为未选中。

我不再提供任何代码,因为它没有必要。我需要指导。

cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

        if (isChecked) {

        } else {

        }
    }
}); 

请不要根据文档添加任何在if (isChecked) {} 块中添加对话框的解决方案:

具有两种状态的按钮,选中和未选中。当按钮是 按下或点击,状态会自动改变。

这意味着侦听器在复选框状态更改后运行,因此此时显示对话框为时已晚。

【问题讨论】:

    标签: android checkbox


    【解决方案1】:

    您应该创建一个自定义复选框并覆盖它的切换方法以对状态执行任何操作。以下是一些示例功能的基本代码:

    在 xml 中,如下声明您的自定义视图(更改您的包名称):

    <com.example.mike.myapplication.CustomCheckBox
        android:id="@+id/my_checkbox"
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    

    然后在你的Activity/fragment中初始化它:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        cb = (CustomCheckBox) findViewById(R.id.my_checkbox);
        // You should ALWAYS add this listener!!!!
        cb.addListener(new CustomCheckedChangeListener() {
    
            @Override
            public void onConfirmCheckDisable() {
                buildDialog();
            }
        });
    }
    
    private void buildDialog() {
        new AlertDialog.Builder(this)
            .setTitle("Confirm")
            .setMessage("Are you sure you want to uncheck this entry?")
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                       cb.setChecked(false);
                  }
            })
           .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int which) { 
                   // do nothing
            }
           })
           .setIcon(android.R.drawable.ic_dialog_alert)
           .show();
    }
    

    这是您的自定义复选框类:

    public class CustomCheckBox extends CheckBox {
    
        private CustomCheckedChangeListener mListener;
    
        public CustomCheckBox(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public CustomCheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public CustomCheckBox(Context context) {
            super(context);
        }
    
        public void addListener(CustomCheckedChangeListener list){
            mListener = list;
        }
    
        @Override
        public void toggle() {
            if (mListener == null) return;
            if (isChecked()) {
                mListener.onConfirmCheckDisable();
            } else {
                super.toggle();
            }
        }
    }
    

    这是你的听众:

    public interface CustomCheckedChangeListener {
    
        public void onConfirmCheckDisable();
    }
    

    这有帮助吗?

    【讨论】:

    • 嗨,迈克。当您在状态更改为未选中后显示对话框时,这将不起作用。
    【解决方案2】:

    这应该可以工作(但要注意这里的上下文,如果你在片段调用 getActivity()):

    cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
    @Override
    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
    
           if (isChecked) {
              AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
              builder.setMessage("Are you sure you want to uncheck this ?")
              .setPositiveButton("Yes", new DialogInterface.OnClickListener(){
                     public void onClick(DialogInterface dialog, int id){
                        buttonView.setChecked(false);
                   }
              }).setNegaviteButton("Cancel", new DialogInterface.OnClickListener(){
                     public void onClick(DialogInterface dialog, int id){
                       buttonView.setChecked(true);
                     }
              });
              AlertDialog alertDialog = builder.create();
              alertDialog.show();
           } 
        }
    });
    

    【讨论】:

      【解决方案3】:

      你只要创建一个AlertDialog,看看

      cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
      
          @Override
          public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
      
              if (isChecked) {
                   confirmCheck();
              }
          }
      });
      
      private void confirmCheck() {
          new AlertDialog.Builder(this)
                        .setIcon(android.R.drawable.ic_dialog_alert)
                        .setTitle("WARNING!")
                        .setMessage("¿Sure u check?")
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which){
                                cb.setChecked(false);
                          }
                        })
                        .setNegativeButton("No", null)
                        .show();
      }
      

      希望对你有所帮助,问候。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 2013-06-26
        • 2012-09-10
        • 2015-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多