如何控制MultiChoice AlertDialog

Ore*_*reo 10 android android-alertdialog multichoiceitems

我在我的应用程序中使用Dialog以允许用户进行多项选择,这是我的代码:

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Build an AlertDialog
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

            // String array for alert dialog multi choice items
            String[] colors = new String[]{
                    "Red",
                    "Green",
                    "Blue",
                    "Purple",
                    "Olive"
            };

            // Boolean array for initial selected items
            final boolean[] checkedColors = new boolean[]{
                    false, // Red
                    false, // Green
                    false, // Blue
                    false, // Purple
                    false // Olive

            };

            // Convert the color array to list
            final List<String> colorsList = Arrays.asList(colors);

            // Set multiple choice items for alert dialog

            builder.setMultiChoiceItems(colors, checkedColors, new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {

                    // Update the current focused item's checked status
                    checkedColors[which] = isChecked;

                    // Get the current focused item
                    String currentItem = colorsList.get(which);

                    // Notify the current action
                    Toast.makeText(getApplicationContext(),
                            currentItem + " " + isChecked, Toast.LENGTH_SHORT).show();
                }
            });

            // Specify the dialog is not cancelable
            builder.setCancelable(false);

            // Set a title for alert dialog
            builder.setTitle("Your preferred colors?");

            // Set the positive/yes button click listener
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do something when click positive button
                    tv.setText("Your preferred colors..... \n");
                    for (int i = 0; i<checkedColors.length; i++){
                        boolean checked = checkedColors[i];
                        if (checked) {
                            tv.setText(tv.getText() + colorsList.get(i) + ", ");
                        }
                    }
                }
            });

            // Set the negative/no button click listener
            builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do something when click the negative button
                }
            });

            // Set the neutral/cancel button click listener
            builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do something when click the neutral button
                }
            });

            AlertDialog dialog = builder.create();
            // Display the alert dialog on interface
            dialog.show();
        }
    });
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 就像我选择了红色和紫色

    (然后在TextView中获得输出这样的:Red, Purple,)

    首先,我想删除逗号(获取最后一个值)

  2. 我已经选择了红色和紫色,当我再次打开对话框时,默认情况下不会选择红色和紫色(我如何保存状态)enter code here,结果,当我再次选择这些(红色和紫色)​​两个项目时,获取每个项目在TextView中两次

And*_*eky 5

请尝试此操作并改进您的代码结构,以便对其进行有效管理。

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private TextView txtSelected;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.btn_dialog);
        txtSelected = (TextView) findViewById(R.id.txt_selected);

        final ArrayList<ColorVO> colorList = new ArrayList<ColorVO>();
        // String array for alert dialog multi choice items
        final String[] colors = new String[]{
                "Red",
                "Green",
                "Blue",
                "Purple",
                "Olive"
        };
        // Boolean array for initial selected items
        final boolean[] checkedColors = new boolean[]{
                false, // Red
                false, // Green
                false, // Blue
                false, // Purple
                false // Olive

        };

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

                // make a list to hold state of every color
                for (int i = 0; i < colors.length; i++) {
                    ColorVO colorVO = new ColorVO();
                    colorVO.setName(colors[i]);
                    colorVO.setSelected(checkedColors[i]);
                    colorList.add(colorVO);
                }

                // Do something here to pass only arraylist on this both arrays ('colors' & 'checkedColors')
                builder.setMultiChoiceItems(colors, checkedColors, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                        // set state to vo in list
                        colorList.get(which).setSelected(isChecked);
                        Toast.makeText(getApplicationContext(),
                                colorList.get(which).getName() + " " + isChecked, Toast.LENGTH_SHORT).show();
                    }
                });

                builder.setCancelable(false);

                builder.setTitle("Your preferred colors?");

                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        txtSelected.setText("Your preferred colors..... \n");

                        // save state of selected vos
                        ArrayList<ColorVO> selectedList = new ArrayList<>();
                        for (int i = 0; i < colorList.size(); i++) {
                            ColorVO colorVO = colorList.get(i);
                            colors[i] = colorVO.getName();
                            checkedColors[i] = colorVO.isSelected();
                            if (colorVO.isSelected()) {
                                selectedList.add(colorVO);
                            }
                        }

                        for (int i = 0; i < selectedList.size(); i++) {
                            // if element is last then not attach comma or attach it
                            if (i != selectedList.size() - 1)
                                txtSelected.setText(txtSelected.getText() + selectedList.get(i).getName() + " ,");
                            else
                                txtSelected.setText(txtSelected.getText() + selectedList.get(i).getName());
                        }
                        colorList.clear();
                    }
                });

                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // make sure to clear list that duplication dont formed here
                        colorList.clear();
                    }
                });

                builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // make sure to clear list that duplication dont formed here
                        colorList.clear();
                    }
                });

                AlertDialog dialog = builder.create();
                dialog.show();
            }
        });
    }

    private class ColorVO {
        private String name;
        private boolean selected;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public boolean isSelected() {
            return selected;
        }

        public void setSelected(boolean selected) {
            this.selected = selected;
        }
    }
Run Code Online (Sandbox Code Playgroud)

解决了您的所有疑问:

1.就像我选择了红色和紫色

=> 检查元素的索引,如果是最后一个,则不要附加逗号。

2.我已经选择了红色和紫色,当我再次打开对话框时,默认情况下没有选择红色和紫色(如何保存状态)

=> 在默认数组中使用 vo 保存状态。它将被保存,直到您的活动没有被销毁。

3. 当我再次选择这些(红色和紫色)​​两个项目时,在 TextView 中获取每个项目两次

=> 清除列表,以便值不会重复。


Emi*_*mil 3

尝试在循环后更新您的文本视图

如果您的循环迭代达到 then 的长度,则checkedcolors不要附加逗号。

public void onClick(DialogInterface dialog, int which) {
        // Do something when click positive button
        tv.setText("Your preferred colors..... \n");
        for (int i = 0; i < checkedColors.length; i++) {
            boolean checked = checkedColors[i];
            String colors = "";
            if (checked) {
                colors = colors + colorsList.get(i) ;
                if (i != checkedColors.length - 1) {
                    colors = colors + ", ";
                }
            }
        }
        tv.setText(tv.getText() + colors);
    }
Run Code Online (Sandbox Code Playgroud)

您的文本视图将仅更新一次,因此您不会在 TextView 中获取每个项目两次。

为了保存状态,你必须使用SharedPreference.

要保存到首选项中,请使用此

       SharedPreferences preferences = mContext.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("yourColor",isChecked);
        editor.commit();
Run Code Online (Sandbox Code Playgroud)

并检索

        boolean isChecked = preferences.getBoolean("yourColor");
Run Code Online (Sandbox Code Playgroud)