如何从Alert.Builder中的多项选项中获取已检查的项目?

时间:2011-08-28 12:33:47

标签: java android alertdialog

有没有办法在下一个Alert.Builder中获取有关已检查项目的信息?当有人点击肯定按钮时,我需要在SharedPreferences中保存一些布尔值。这些布尔值来自用户在警报中所做的选择。我怎么能得到它们?

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        final SharedPreferences preferences = getSharedPreferences("type_settings", MODE_PRIVATE);

        boolean[] selectedTypes = getSelectedTypes(preferences);

        builder.setIcon(R.drawable.menu_type)
                .setTitle(R.string.list_dialog_title)
                .setMultiChoiceItems(R.array.select_type_items, selectedTypes,
                        new DialogInterface.OnMultiChoiceClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) {
                            }
                        })
                .setPositiveButton(R.string.types_save, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        SharedPreferences.Editor prefEditor = preferences.edit();
                    }
                })
                .setNegativeButton(R.string.types_cancel, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.cancel();
                    }
                })
                .create();
        builder.show();

3 个答案:

答案 0 :(得分:9)

您可以使用getCheckedItemIds()getCheckedItemPositions ()从列表视图中获取已检查项目的列表。您应该先使用AlertDialog.getListView()来获取对话框的列表视图。

mAlert.getListView().getCheckedItemPositions ();

答案 1 :(得分:2)

我设法以某种方式解决了这个问题,但我不知道这是不是一个好习惯。这是代码:

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        final SharedPreferences preferences = getSharedPreferences("type_settings", MODE_PRIVATE);

        final String[] availableTypes = getResources().getStringArray(R.array.select_type_items);
        final boolean[] selectedTypes = getSelectedTypes(preferences, availableTypes);

        builder.setIcon(R.drawable.menu_type)
                .setTitle(R.string.list_dialog_title)
                .setMultiChoiceItems(R.array.select_type_items, selectedTypes,
                        new DialogInterface.OnMultiChoiceClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) {
                                selectedTypes[whichButton] = isChecked;
                            }
                        })
                .setPositiveButton(R.string.types_save, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        SharedPreferences.Editor prefEditor = preferences.edit();
                        saveSelectedTypes(prefEditor, availableTypes, selectedTypes);
                    }
                })
                .setNegativeButton(R.string.types_cancel, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.cancel();
                    }
                })
                .create();
        builder.show();

答案 2 :(得分:0)

为了提高存储效率,您可以在将布尔数组存储为首选项之前将其转换为整数。但要注意,初始化AlertDialog列表的布尔数组具有与AlertDialog相反的布尔数组结果。 (似乎是一致的逆转:在OS 2.3.6和4.2.2上发生......我还没有检查过任何其他版本。)