13

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

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

我有两个疑问:

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

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

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

  2. 我已经选择了红色和紫色,当我再次打开对话框时,默认情况下没有选择红色和紫色(如何保存状态)enter code here,因此,当我再次选择这两个项目(红色和紫色)​​时,得到每个项目在 TextView 中两次

4

2 回答 2

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

解决了您的所有疑问:

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

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

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

=> 在您的默认数组中使用 vo 保存状态。它将一直保存到您的活动未被破坏为止。

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

=> 清除列表,以免值重复。

于 2015-09-01T05:39:10.320 回答
3

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

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

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

你的 textview 只会更新一次,所以你不会在 TextView 中获得每个项目两次。

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

为了保存到偏好使用这个

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

        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("yourColor",isChecked);
        editor.commit();

并检索

        boolean isChecked = preferences.getBoolean("yourColor");
于 2015-09-01T04:49:30.670 回答