JFileChooser alternative für android?

  • 4 Antworten
  • Letztes Antwortdatum
Railwanderer

Railwanderer

Ambitioniertes Mitglied
11
Hi,
gibt es eine Alternative für den JFileChooser unter Android? Ich nutze ihn unter Java, aber ziehe mir letzen
Endes nur den Pfad der Datei aus der Auswahl, nicht die Datei, dafür habe ich ein extra Interface.
Muss ich für Android dazu eine andre App Api einbinden( so wie in manchen apps der foto button die Kamera app öffnet und ein Bild zurück liefert)? Oder liefert Android selbst eine simple Methode um in einer list
view oder ähnlich die Ordner anzuzeigen , quasi wie beim file chooser das Dialog Fenster?
 
Da wirst du dir selber was implementieren müssen. Aber, das schöne bei Android, es gibt (fast) nichts was nicht schon jemand anders für dich getan hat :)

Im letzten Projekt habe ich auch einen FileChooser benötigt. Dazu habe ich folgendes geschrieben:

Code:
import android.app.Activity;
import android.app.Dialog;
import android.os.Environment;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager.LayoutParams;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.regex.Pattern;

/**
* Klasse um einen einfachen FileChooser anzuzeigen.
*
* Hier könnte ihr Name stehen :-)
*/
public class FileChooser {
    private static final String PARENT_DIR = "..";

    private final Activity activity;
    private ListView list;
    private Dialog dialog;
    private File currentPath;
    private Pattern pattern = null;

    /**
     * Filter setzten um den Dateityp einzugrenzen.
     *
     * @param extension {@link String} Dateityp
     */
    public FileChooser setExtension(String extension) {
        pattern = Pattern.compile(extension);
        return this;
    }

    /**
     * Event-Handling für die Dateiauswahl.
     */
    public interface FileSelectedListener {
        void fileSelected(File file);
    }

    public FileChooser setFileListener(FileSelectedListener fileListener) {
        this.fileListener = fileListener;
        return this;
    }

    private FileSelectedListener fileListener;

    public FileChooser(Activity activity) {
        this.activity = activity;
        dialog = new Dialog(activity);
        list = new ListView(activity);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int which, long id) {
                String fileChosen = (String) list.getItemAtPosition(which);
                File chosenFile = getChosenFile(fileChosen);
                if (chosenFile.isDirectory()) {
                    refresh(chosenFile);
                } else {
                    if (fileListener != null) {
                        fileListener.fileSelected(chosenFile);
                    }
                    dialog.dismiss();
                }
            }
        });
        dialog.setContentView(list);
        dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        refresh(Environment.getExternalStorageDirectory());
    }

    /**
     * Methode um den Dialog anzuzeigen.
     */
    public void showDialog() {
        dialog.show();
    }


    /**
     * Sortieren, Filtern und Anzeige der Dateien für den gegebenen Pfad.
     * @param path {@link File}
     */
    private void refresh(File path) {
        this.currentPath = path;
        if (path.exists()) {
            File[] dirs = path.listFiles(new FileFilter() {
                @Override
                public boolean accept(File file) {
                    return (file.isDirectory() && file.canRead());
                }
            });
            File[] files = path.listFiles(new FileFilter() {
                @Override
                public boolean accept(File file) {
                    if (!file.isDirectory()) {
                        return file.canRead() &&
                                (pattern == null || pattern.matcher(file.getName()).matches());
                    } else {
                        return false;
                    }
                }
            });

            // zum Array konvertieren
            int i = 0;
            String[] fileList;
            if (path.getParentFile() == null) {
                fileList = new String[dirs.length + files.length];
            } else {
                fileList = new String[dirs.length + files.length + 1];
                fileList[i++] = PARENT_DIR;
            }
            Arrays.sort(dirs);
            Arrays.sort(files);
            for (File dir : dirs) { fileList[i++] = dir.getName(); }
            for (File file : files) { fileList[i++] = file.getName(); }

            // User Interface aktualisieren.
            dialog.setTitle(currentPath.getPath());
            list.setAdapter(new ArrayAdapter<Object>(activity,
                    android.R.layout.simple_list_item_1, fileList) {
                @Override
                public View getView(int pos, View view, ViewGroup parent) {
                    view = super.getView(pos, view, parent);
                    ((TextView) view).setSingleLine(true);
                    return view;
                }
            });
        }
    }

    /**
     * Konvertieren eines Dateipfades zu einem Datei-Objekt.
     *
     * @param fileChosen Dateipfad
     * @return {@link} Datei zum angegebenen Pfad.
     */
    private File getChosenFile(String fileChosen) {
        if (fileChosen.equals(PARENT_DIR)) {
            return currentPath.getParentFile();
        } else {
            return new File(currentPath, fileChosen);
        }
    }
}

Diesen kannst du dann wie folgt aufrufen:

Code:
new FileChooser(getActivity()).setExtension(FILE_EXTENSIONS).setFileListener(this).showDialog();

Die Extension:

Code:
private static final String FILE_EXTENSIONS =
            "([^\\s]+(\\.(?i)(jpg|jpeg|png|gif))$)";

dient dazu um sich nur bestimmte Dateitypen anzeigen lassen zu können. (Kann in manchen Fällen hilfreich sein ;-) )

Die Klasse die diesen FileChooser verwendet muss folgendes Interface implementieren:

Code:
FileChooser.FileSelectedListener

und passend dazu folgende Methode implementieren:

Code:
/**
     * @see FileChooser#fileListener
     *
     * @param file die vom Benutzer ausgewählte Datei.
     */
    @Override
    public void fileSelected(File file) {
        // Datei verarbeiten ...
    }
 
Zuletzt bearbeitet von einem Moderator:
  • Danke
Reaktionen: Railwanderer
Super! Vielen Dank für die ausführliche Antwort, ich werde es aufjedenfall die Woche implementieren :)
Ich habe gerade mein Android/ desktop Framework weitergeschrieben und dabei kam ich auf den Jfilechooser.
Ich habe nun die Dekstop Version um einen simplen Mapeditor erweitert, bei dem man TileSheets über den filechooser auswählt.
Es klappt auch alles zu speichern, nun werde ich heut abend nach der Spätschicht noch ein wenig den Code aufräumen und dann
deinen Vorschlag ausprobieren und nach einer Lösung suchen unter Android bilder mit in eine byte datei zu speichern :)

Dein Tipp wird mir aufhedenfall sehr helfen, ich meld mich die Tage zurueck wenn das erweitere Framework online ist :)
 
jawoll soviel tipps :D vielen dank schonmal!
mich hält nur noch eins davon ab es endlich für android zu implementieren, und zwar habe ich zunächst mit der serializable klasse unter java meine zu speichernden klassen erweitert, alles lies sich auch als bytes in eine Datei speisen.
nur bei den buffered images musste ich eine etwas umständlichere Methode (transient keyword ;) ) diese extra abspeichern und auslesen.allerdings merke ich eben aber dass einige arrays mit werten nicht richtig geladen werden. wahrscheinlich muss ich die auch beim abspeichern extra durchgehen und beim laden ebenso loopen. aber keine sorge ich bin voll dabei,sobald es übersichtlicher wird stelle ich alles wieder online :) eure Vorschläge probiere ich bis zum Wochenende aus und melde mich zurück, ich hoffe bis zum Sonntag dann alles im platform übergreifenden framework sauber stehen zu haben das ihr das Ergebnis auch ausprobieren könnt.
 

Ähnliche Themen

Mr-Fisch
Antworten
5
Aufrufe
411
migi01
migi01
Mr-Fisch
Antworten
8
Aufrufe
463
Mr-Fisch
Mr-Fisch
M
Antworten
9
Aufrufe
507
mkuz24
M
A
Antworten
5
Aufrufe
498
swa00
swa00
S
Antworten
7
Aufrufe
798
Silvasurf
S
Zurück
Oben Unten