Tworzę prostą aplikację do obsługi obrazów i mam problem ze zmianą nazw obrazów. Użytkownik wybiera wiele obrazów w galerii i kliknij przycisk, aby zmienić ich nazwę. klasa odpowiedzialna za operację zmiany nazwy i jest miejscem, w którym mam problem.

Pierwsza część kodu wygląda następująco:

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

Główne argumenty tej klasy to kontekst i „InputImages”. „InputImages” to ArrayList, który zawiera wybrany identyfikator obrazu, tytuł, ścieżkę i bitmapę. ArrayList „Images” to w zasadzie „InputImages”. Użytkownik wprowadza nazwę, a wszystkie pliki są zmieniane na wybraną przez użytkownika nazwę po zwiększeniu nazwy pliku. Zasadniczo, jeśli użytkownik wpisze „nazwę”, nazwy plików zostaną zmienione na „nazwa.png”, „nazwa (1) .png”, „nazwa (2) .png” i tak dalej

Główną metodą jest „Rename ()”, która jest po prostu alertDialog, która wymaga od użytkownika wprowadzenia nowej nazwy. Gdy użytkownik kliknie przycisk „OK”, metoda przechodzi przez „Images” ArrayList i wypełnia dwie tablice, wielowymiarową tablicę „RenameArray_Files” i „RenameArray_State”. „RenameArray_Files” zawiera oryginalny plik i nowy plik, a „RenameArray_State” zawiera jeden z trzech stanów: „Zapis” lub „Konflikt”. „Write” to po prostu zmiana nazwy pliku, „Conflict” oznacza, że nazwa pliku już istnieje iw takich przypadkach ustawiana jest flaga „ConflictFlag [0]

Po całkowitym zapętleniu tablicy ArrayList, jeśli nie ma konfliktów (opcja „Conflictflag [0]” nie jest ustawiona), wywoływana jest metoda „RenameOperation” i zmieniane są nazwy wszystkich plików.

W przypadku konfliktu wywoływana jest metoda „OverwriteSkip”. Chodzi o to, aby użytkownik zdecydował, czy nadpisać plik, pominąć go (lub później zmienić jego nazwę, ale jeszcze nie tam). użytkownik może również wybrać, czy jego decyzja dotyczy wszystkich plików, czy tylko jednego.

      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 przechodzi w pętlę przez „RenameArray_State”, gdy zostanie osiągnięty plik będący w konflikcie, a użytkownik nie ustawił jeszcze flagi stosowanej do wszystkich konfliktów, zostanie wyświetlony drugi alartdialog z prośbą o nadpisanie lub pominięcie pliku. Dostępne będzie również pole wyboru umożliwiające zastosowanie decyzji do wszystkich konfliktów. Jeśli to pole wyboru zostanie zaznaczone, w następnym konflikcie zostanie automatycznie zastosowana decyzja.

Problem polega na tym, że drugi alert nie pojawia się, dopóki pętla for nie zostanie całkowicie iterowana. Rozumiem, że powodem tego jest to, że okno dialogowe ostrzeżenia nie powoduje zajętości systemu i utrudnia inne operacje. Ale nie jestem pewien, jak uruchomić tę logikę. Czytałem, że muszę zaimplementować drugi wątek, w którym wyświetlane jest drugie okno dialogowe ostrzeżenia, ale nie jestem pewien, jak to zrobić, jestem nowy w Androidzie i Javie, więc mogę skorzystać z pomocy! Jestem otwarty na inne sposoby zrobienia tego poza drugim wątkiem! Zapłacę słowami pochwały i nagimi zdjęciami (kłamię ... bez nagości, tylko pochwała i uznanie)

0
G1408 20 listopad 2019, 08:48

1 odpowiedź

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

                }
            }
        });
0
Aditya Modi 20 listopad 2019, 10:09
Gdzie to umieścić? jakiego widoku słucham?
 – 
G1408
22 listopad 2019, 07:11