for循环内的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.png”,“ name(1).png”,“ name(2).png”等等

主要方法是“ Rename()”,它基本上是一个alertDialog,要求用户输入新名称。用户单击“确定”后,该方法将遍历“图像” ArrayList,并填充两个数组,即多维数组“ RenameArray_Files”和“ RenameArray_State”。 “ RenameArray_Files”包含OriginalFile和NewFile,“ RenameArray_State”包含三个状态之一,“写入”或“冲突”。 “写”基本上是更改文件名,“冲突”表示文件名已经存在,在这种情况下,设置了标志“ 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",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的新手,所以请使用帮助!除了第二个线程,我愿意接受其他方法! 我将以赞美和裸照的形式支付(我在撒谎。没有裸体,只是赞美和赞赏)

shuishuiwoai 回答:for循环内的AlertDialog

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

                }
            }
        });
本文链接:https://www.f2er.com/3068480.html

大家都在问