使用复选框实现对话框

时间:2013-07-25 13:32:01

标签: android checkbox dialog

这是我的对话框

public class CustomDialogClass extends Dialog implements
 android.view.View.OnClickListener {

     public Activity c;
     public Dialog d;
     public Button no;
     CheckBox yes;
     boolean p;
     public CustomDialogClass(Activity a) {
         super(a);
         // TODO Auto-generated constructor stub
         this.c = a;
     }

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         requestWindowFeature(Window.FEATURE_NO_TITLE);
         setContentView(R.layout.custom_dialog);
         yes = (CheckBox) findViewById(R.id.checkBox1);
         no = (Button) findViewById(R.id.btn_no);
         no.setOnClickListener(this);
         yes.setChecked(false);
         yes.setOnClickListener(this);
     }

     @Override
     public void onClick(View v) {
         switch (v.getId()) {
         case R.id.checkBox1:
             yes.setChecked(true);
             break;
         case R.id.btn_no:
             dismiss();
             break;
         default:
             break;
         }
     }
 }

现在,我打开对话框并选中复选框,单击按钮并关闭对话框。但是当我再次打开它时,复选框再次被取消选中。我该怎么办?

2 个答案:

答案 0 :(得分:6)

不建议您使用对话框的方式了!您应该考虑使用 DialogFragment

您丢失已检查状态的原因是因为再次打开对话框时会重新创建对话框。

请参阅DialogFragment方法http://developer.android.com/reference/android/app/DialogFragment.html的此示例。您将看到可以将参数传递给对话框。

对于解决方案,我建议您在关闭对话框时将所选值传递回托管活动...当应重新打开对话框时,只需将参数传递给对话框,以便对话框设置其默认选择。

修改

  1. 由于您希望显示复选框,我将采取并调整 来自的示例代码 http://developer.android.com/guide/topics/ui/dialogs.html#AddingAList 对于复选框。使用它仍然很方便 AlertDialog.Builder。

  2. 通过覆盖将生成器包装到DialogFragment中 onCreateDialog法。您可以通过所选项目列表 Bundle作为布尔数组,然后用于setMultiChoiceItems。

    public class CheckBoxAlertDialogFragment extends DialogFragment {
        public static CheckBoxAlertDialogFragment newInstance(boolean[] checkedItems) {
            CheckBoxAlertDialogFragment frag = new CheckBoxAlertDialogFragment();
            Bundle args = new Bundle();
            args.putBooleanArray("checkedItems", checkedItems);
            frag.setArguments(args);
            return frag;
    }
    
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final boolean[] checkedItems = getArguments().getBooleanArray("checkedItems");
    
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // Set the dialog title
        builder.setTitle(R.string.pick_toppings)
                // Specify the list array, the items to be selected by default (null for none),
                // and the listener through which to receive callbacks when items are selected
                .setMultiChoiceItems(R.array.toppings, checkedItems,
                        new DialogInterface.OnMultiChoiceClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which,
                                                boolean isChecked) {
                                checkedItems[which] = isChecked;
                            }
                        })
                // Set the action buttons
                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        // User clicked OK, so save the checkedItems results somewhere
                        // or return them to the component that opened the dialog
                        //...
                    }
                })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        //...
                    }
                });
    
        return builder.create();
    }
    }
    
  3. 在您的活动中,您应该有一个变量,例如命名为checkedItems,类型为boolean [],保存复选框状态。您可以使用以下命令打开对话框:

    void showDialog() {
            DialogFragment newFragment = CheckBoxAlertDialogFragment.newInstance(checkedItems);
            newFragment.show(getFragmentManager(), "dialog tag");
        }
    

答案 1 :(得分:1)

每次显示/创建对话框时,都会取消选中您的复选框,因为在onCreate方法中,您有yes.setChecked(false);。您应该在解除之前保存复选框的值,而不是仅仅关闭对话框,并在每次创建对话框时获取该值以重置复选框。您可以使用SharedPreferences,即使您的活动被销毁也会保留该值,或者根据您的主要活动的需要来回传递值。

感谢@andd,我忘记了Dialog已被弃用,他说你应该使用DialogFragment是对的,在这种情况下,不需要使用SharedPreferences。