2

Here is my Dialog box

 

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;
         }
     }
 }

Now, I open the dialog and check the checkbox, click on button and dismiss the dialog. But When I open it again, the checkbox is again unchecked. what should i do?

4

2 回答 2

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. 通过覆盖 onCreateDialog 方法将 Builder 包装到 DialogFragment 中。您可以通过 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. 在您的活动中,您应该在某处保存复选框状态的 boolean[] 类型的变量,例如名为checkedItems。您可以使用以下命令打开对话框:

    void showDialog() {
            DialogFragment newFragment = CheckBoxAlertDialogFragment.newInstance(checkedItems);
            newFragment.show(getFragmentManager(), "dialog tag");
        }
    
于 2013-07-25T13:39:20.747 回答
1

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

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

于 2013-07-25T13:37:48.193 回答