我正在创建一个简单的图像应用程序,但无法重命名图像 用户在图库中选择多个图像,然后单击按钮将其全部重命名。负责重命名操作的班级,也是我遇到麻烦的地方。
代码的第一部分如下:
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的新手,所以请使用帮助!除了第二个线程,我愿意接受其他方法! 我将以赞美和裸照的形式支付(我在撒谎。没有裸体,只是赞美和赞赏)