NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Odstranění file z ExternalStorageDirectory

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
qwasyx0
Člen
Avatar
qwasyx0:14.5.2017 13:23

Zdravím, programuji v android studiu jednoduchý notepad. Když kliknu na tlačítko, chtěl bych vymazat otevřenou poznámku z ExternalStora­geDirectory.

Můj kód:

public class NoteManager {

private Context context;
private String path = Environment.ge­tExternalStora­geDirectory()­.toString() + "/Notes/";

public NoteManager(Context _context) {
this.context = _context;
}

public NoteManager() {

}

public void CreateNewDirec­tory() {
File mydir = new File(this.path);
if (!mydir.exists())
mydir.mkdirs();
else
Log.d("error", "dir. already exists");
}

public void SaveNote(String sFileName, String sBody) {
try {
File root = new File(this.path);
if (!root.exists()) {
root.mkdirs();
}
File file = new File(root, sFileName);
FileWriter writer = new FileWriter(file);
writer.append(sBo­dy);
writer.flush();
writer.close();
Toast.makeTex­t(this.contex­t, "Saved", Toast.LENGTH_SHOR­T).show();
} catch (IOException e) {
e.printStackTra­ce();
//importError = e.getMessage();
//iError();
}
}

public String readNote(String filename) {
StringBuilder text = new StringBuilder();
try {
//File sdcard = Environment.ge­tExternalStora­geDirectory() + "/Notes/";
File file = new File(this.path, filename);
//System.out.prin­tln("exception");

BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
text.append(line);
//System.out.prin­tln("text : "+text+" : end");
text.append('\n');
}
} catch (IOException e) {
e.printStackTra­ce();
//System.out.prin­tln("hello");

}

return text.toString();
}

public ArrayList<FileName> GetNotesList() {

File f = new File(this.path);
File file[] = f.listFiles();

ArrayList<FileName> filenames = new ArrayList<File­Name>();
for (int i = 0; i < file.length; i++) {
String desc = new NoteManager()­.readNote(file[i]­.getName());
FileName filename = new FileName(file[i]­.getName(), desc);
filenames.add(fi­lename);
}

return filenames;
}

}

public class Note extends Activity {

@Override
public boolean onOptionsItem­Selected(Menu­Item item) {
switch (item.getItemId()) {
case R.id.action_save:
SaveNote();
return true;
case R.id.action_delete:
DeleteNote(); //Zde bych ji chtěl odtranit
return true;
default:
return super.onOption­sItemSelected(i­tem);
}
}

//Takhle vypadá SaveNote
private void SaveNote() {
if (filename == null && t.getText() != "") {

AlertDialog.Builder alert = new AlertDialog.Bu­ilder(this);

alert.setTitle("No­te Name");
alert.setMessa­ge("Please input the note name.");

final EditText input = new EditText(this);
alert.setView(in­put);

alert.setPosi­tiveButton("Ok", new DialogInterfa­ce.OnClickLis­tener() {
public void onClick(Dialo­gInterface dialog, int whichButton) {
String value = input.getText()­.toString();
filename = value + ".txt";
new NoteManager(No­te.this).Save­Note(filename, et_note.getTex­t().toString());
}
});

alert.setNega­tiveButton("Can­cel", new DialogInterfa­ce.OnClickLis­tener() {
public void onClick(Dialo­gInterface dialog, int whichButton) {

}
});

alert.show();

} else {

new NoteManager(No­te.this).Save­Note(filename, et_note.getTex­t().toString());
}
}

 
Odpovědět
14.5.2017 13:23
Avatar
qwasyx0
Člen
Avatar
qwasyx0:14.5.2017 14:21

Vyřešil jsem to jinak, Už mi to odstraňuje poznámku, pouzil jsem longclicklistener. Chtěl bych ale dialogové okno kde se to zeptá Are you sure?.

lv_filenames.se­tOnItemLongClic­kListener(new AdapterView.O­nItemLongClic­kListener() {

@Override
public boolean onItemLongClic­k(AdapterView<?> parent, View view,
int position, long id) {
AlertDialog.Builder alert = new AlertDialog.Bu­ilder(Main.this);
alert.setTitle("De­lete note");
alert.setMessa­ge("Are you sure you want to delete this note?");

alert.setPosi­tiveButton("Ok", new DialogInterfa­ce.OnClickLis­tener() {
public void onClick(Dialo­gInterface dialog, int whichButton) {
adapter.remove(fi­lenames.get(po­sition));
adapter.notify­DataSetChanged();
}
});

alert.setNega­tiveButton("Can­cel", new DialogInterfa­ce.OnClickLis­tener() {
public void onClick(Dialo­gInterface dialog, int whichButton) {

}
});

return false;
}

});

Jak to udělat aby to běželo? Nespustí se alert, myslím, že chyba je v

AlertDialog.Builder alert = new AlertDialog.Bu­ilder(Main.this);

a také v alert.setPosi­tiveButton mi to říká, že position musí být final, což by neměla být ale když to dám mimo ten setpositivebutton, smaže se.

 
Nahoru Odpovědět
14.5.2017 14:21
Avatar
wgamez101
Člen
Avatar
Odpovídá na qwasyx0
wgamez101:14.5.2017 19:03
AlertDialog.Builder alert = new AlertDialog.Builder(Main.this);

Ahoj, týmto vytváraš iba Builder pre AlertDialog, aby si AlertDialog zobrazil, musíš zavolať metódu show() na dialógu. Okrem toho k parameteru position pristupuješ z anonymnej triedy, to znamená že musí byť finálna.

lv_filenames.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
                AlertDialog.Builder alert = new AlertDialog.Builder(Main.this);
                alert.setTitle("Delete note");
                alert.setMessage("Are you sure you want to delete this note?");

                alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                                adapter.remove(filenames.get(position));
                                adapter.notifyDataSetChanged();
                        }
                });

                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {

                        }
                });

                alert.show();

                return false;
        }

});
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
14.5.2017 19:03
There are only two kinds of programming languages: those people always bitch about and those nobody uses. -- Bjarne...
Avatar
qwasyx0
Člen
Avatar
qwasyx0:14.5.2017 21:47

Díky, už to ukazuje dialog ale když potvrdím že hcci smazat, otevře se místo aby se smazala. Myslím, že je to proto, že se vymaže pouze z adapteru, tedy textView, ale stále je v Arraylistu. Nevěděl by jsi jak to smazat i z arraylistu?

public ArrayList<FileName> GetNotesList() {

File f = new File(this.path);
File file[] = f.listFiles();

ArrayList<FileName> filenames = new ArrayList<File­Name>();
for (int i = 0; i < file.length; i++) {
String desc = new NoteManager()­.readNote(file[i]­.getName());
FileName filename = new FileName(file[i]­.getName(), desc);
filenames.add(fi­lename);
}

return filenames;
}

 
Nahoru Odpovědět
14.5.2017 21:47
Avatar
qwasyx0
Člen
Avatar
qwasyx0:14.5.2017 21:50

https://www.itnetwork.cz/dev-lighter/925 můj celý zdroják

 
Nahoru Odpovědět
14.5.2017 21:50
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.