我正在创建一个简单的图像应用程序,但在重命名图像时遇到问题 用户在图库中选择多个图像,然后单击按钮将它们全部重命名。负责重命名操作的类是我遇到麻烦的地方。
第一部分代码如下:
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/