java - for 循环内的 AlertDialog

标签 java android android-alertdialog

我正在创建一个简单的图像应用程序,但在重命名图像时遇到问题 用户在图库中选择多个图像,然后单击按钮将它们全部重命名。负责重命名操作的类是我遇到麻烦的地方。

第一部分代码如下:

class RenameFiles {
    private Context mContext;
    private ArrayList<CreateList> Images;
    private ArrayList mSelectedItems;
    private int RenameAppendCounter = 0;
    private boolean DecisionForAll = false;
    private String RenameConflictDecision = "";
    private String[] RenameArray_State;
    private File[][] RenameArray_Files;

FileSystemClass(Context context, ArrayList<CreateList> InputImages) {
    mContext = context;
    Images = InputImages;
    RenameArray_State = new String[InputImages.size()];
    RenameArray_Files = new File[InputImages.size()][2];
    mHandler = new Handler();
    Rename();
}

private void Rename() {
    String DialogBoxTitle = "Rename";
    String DialogBoxMessage = "Enter new name";
    final AlertDialog.Builder DialogBox = new AlertDialog.Builder(mContext);
    DialogBox.setTitle(DialogBoxTitle);
    DialogBox.setMessage(DialogBoxMessage);
    final EditText UserInput = new EditText(mContext);
    UserInput.setInputType((InputType.TYPE_CLASS_TEXT));
    DialogBox.setView(UserInput);
    final boolean[] ConflictFlag = {false};
    DialogBox.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            File imgFolder = new File(String.valueOf(mContext.getExternalFilesDir(null)));
            for (int i = 0; i < Images.size(); i++) {
                String NewFileName = UserInput.getText().toString();
                if (RenameAppendCounter > 0) {
                    NewFileName = NewFileName + " (" + String.valueOf(RenameAppendCounter) + ")";
                }
                File NewFile = new File(imgFolder, NewFileName + ".png");
                File OriginalFile = new File(Images.get(i).getImage_path());

                if (NewFile.exists()) {
                    RenameArray_State[i] = "Conflict";
                    ConflictFlag[0] = true;
                    RenameArray_Files[i][0] = OriginalFile;
                    RenameArray_Files[i][1] = NewFile;
                    RenameAppendCounter = RenameAppendCounter + 1;

                } else {
                    RenameArray_State[i] = "Write";
                    RenameArray_Files[i][0] = OriginalFile;
                    RenameArray_Files[i][1] = NewFile;
                    //  RenameOperation(OriginalFile,NewFile);
                    RenameOperation(OriginalFile, NewFile);
                    RenameAppendCounter = RenameAppendCounter + 1;

                }
            }
            if (!ConflictFlag[0]) {
                for (int i = 0; i < RenameArray_State.length; i++) {
                    RenameOperation(RenameArray_Files[i][0], RenameArray_Files[i][1]);
                }
            } 
            else {
                OverwriteSkip();
            }
            dialog.dismiss(); 
        }
    });
    DialogBox.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
    DialogBox.show();
}

该类的主要参数是上下文和“InputImages”。 “InputImages”是一个ArrayList,其中包含所选图像的ID、标题、路径和位图。 ArrayList“图像”基本上是“InputImages” 用户输入名称,所有文件在增加文件名后将重命名为用户选择的名称。因此,基本上,如果用户输入“name”,文件将被重命名为“name.png”、“name (1).png”、“name (2).png”等

主要方法是“Rename()”,它基本上是一个警报对话框,要求用户输入新名称。用户单击“确定”后,该方法将循环遍历“Images”ArrayList 并填充两个数组:多维数组“RenameArray_Files”和“RenameArray_State”。 “RenameArray_Files”包含 OriginalFile 和 NewFile,“RenameArray_State”包含三种状态之一:“Write”或“Conflict”。 “写入”基本上是更改文件名,“冲突”意味着文件名已经存在,在这种情况下,设置了标志“ConflictFlag[0]

一旦 ArrayList 完全循环,如果没有冲突(未设置“Conflictflag[0]”),则调用方法“RenameOperation”并重命名所有文件。

如果存在冲突,则调用“OverwriteSkip”方法。这个想法是让用户决定是否覆盖文件、跳过它(或者稍后重命名它,但现在还没有)。用户还可以选择他们的决定是否适用于所有文件或仅适用于一个文件。

      private void OverwriteSkip() {
        for (int i = 0; i < RenameArray_State.length; i++) {
            final File OriginalFile = RenameArray_Files[i][0];
            final File NewFile = RenameArray_Files[i][1];
            if (RenameArray_State[i].equals("Conflict")) {
                if (DecisionForAll && RenameConflictDecision.equals("Overwrite")) {
                    RenameArray_State[i] = "Write";
                    RenameOperation(RenameArray_Files[i][0], RenameArray_Files[i][1]);
                } else if (DecisionForAll && RenameConflictDecision.equals("Skip")) {
                    RenameArray_State[i] = "Skip";
                    RenameOperation(RenameArray_Files[i][0], RenameArray_Files[i][1]);
                } else if (!DecisionForAll) {
                    final int finali = i;
                    String ConflictingFileName = NewFile.getName();
                    String[] Choices = new String[1];
                    Choices[0] = "Apply to all conflicts";
                    AlertDialog.Builder builder;
                    builder = new AlertDialog.Builder(mContext);
                    builder.setTitle("File '" + ConflictingFileName + "' already exists");
                    mSelectedItems = new ArrayList();  // Where we track the selected items
                    builder.setMultiChoiceItems(Choices, null, new DialogInterface.OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                            if (isChecked) {
                                // If the user checked the item, add it to the selected items
                                mSelectedItems.add(which);
                            } else if (mSelectedItems.contains(which)) {
                                // Else, if the item is already in the array, remove it
                                mSelectedItems.remove(Integer.valueOf(which));
                            }
                        }
                    });
                    builder.setPositiveButton("Overwrite", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            RenameConflictDecision = "Overwrite";
                            DecisionForAll = false;
                            if (mSelectedItems.size() == 1) {
                                DecisionForAll = true;
                                RenameConflictDecision = "OverwriteAll";
                            }
                            RenameArray_State[finali] = "Write";
                            RenameOperation(OriginalFile, NewFile);
                        }
                    });
                    builder.setNegativeButton("Skip", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            DecisionForAll = false;
                            RenameConflictDecision = "Skip";
                            if (mSelectedItems.size() == 1) {
                                DecisionForAll = true;
                                //      RenameConflictDecision = "SkipAll";
                            }
                            RenameArray_State[finali] = "Skip";
                            //        RenameAppendCounter = RenameAppendCounter + 1;
                        }
                    });
                    builder.show();
                }
            }
            else {
                RenameOperation(RenameArray_Files[i][0], RenameArray_Files[i][1]);
            }

        }

    }

    private void RenameOperation(File OriginalFile, File NewFile) {
        OriginalFile.renameTo(NewFile);
    }
}

OverwriteSkip 循环遍历“RenameArray_State”,一旦到达冲突文件,并且用户尚未设置应用于所有冲突的标志,将显示第二个警报对话框,要求用户覆盖或跳过该文件。还将提供一个复选框,用于将决策应用于所有冲突。如果单击此复选框,下一次冲突将自动应用该决策。

问题是,直到 for 循环完全迭代后,第二个警报才会弹出。我了解其背后的原因,以便警报对话框不会使系统繁忙并妨碍其他操作。但我不确定如何运行这个逻辑。我读到我需要实现第二个线程,其中显示第二个警报对话框,但我不知道如何做到这一点,我是 Android 和 Java 新手,所以我可以使用帮助!除了第二个线程之外,我愿意接受其他方法! 我会用赞美的话和裸照来付出(我在撒谎..没有裸露,只是赞美和欣赏)

最佳答案

mForloop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int i;
                for (i = 0; i <= 5; i++) {
                        openAlertDailog();

                }
            }
        });

关于java - for 循环内的 AlertDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58947536/

相关文章:

android - ListView 的内容占用大量内存

android - 想要在带有 onClick 监听器和 onLongClickListener 的警报对话框中有一个 ListView

java - 与电子邮件地址的对话

Java : Open file in default editor and jump to line number

android - 列表未在 android 中显示

android - 在 Unity3D 中切换 android 太慢

android - 当我使用 alertDialog 函数时,如何在屏幕旋转时使用 DialogFragments 保存对话框?

java - Android 网络监听方式发生变化

java - 使括号匹配的方法

java - WSO2 APIM 1.10 : I'm getting following exception when i started server