148 votes

Choisissez la boîte de dialogue de fichier

Quelqu'un sait-il d'un dialogue choisir fichier? Peut-être un endroit où vous pouvez filtrer tous les fichiers sauf pour ceux avec des extensions spécifiques? L'internet a besoin d'un tel exemple. Je n'ai rien trouvé suffisamment léger pour mettre en œuvre facilement dans une de mes projets. Les seules autres options semblent être en utilisant OI FileManger ouvert intentions, mais qui demande à l'utilisateur d'avoir le gestionnaire de fichiers installés.

Je vous serais extrêmement reconnaissant si quelqu'un pouvait remarquer une boîte de Dialogue qui permettrait à l'utilisateur de parcourir les dossiers et sélectionnez un fichier et retourne le chemin.

185voto

schwiz Points 13679

Eh bien, si vous me tempérez avec rep: D Il vous suffit de remplacer onCreateDialog dans une activité.

 //In an Activity
private String[] mFileList;
private File mPath = new File(Environment.getExternalStorageDirectory() + "//yourdir//");
private String mChosenFile;
private static final String FTYPE = ".txt";    
private static final int DIALOG_LOAD_FILE = 1000;

private void loadFileList() {
    try {
        mPath.mkdirs();
    }
    catch(SecurityException e) {
        Log.e(TAG, "unable to write on the sd card " + e.toString());
    }
    if(mPath.exists()) {
        FilenameFilter filter = new FilenameFilter() {

            @Override
            public boolean accept(File dir, String filename) {
                File sel = new File(dir, filename);
                return filename.contains(FTYPE) || sel.isDirectory();
            }

        };
        mFileList = mPath.list(filter);
    }
    else {
        mFileList= new String[0];
    }
}

protected Dialog onCreateDialog(int id) {
    Dialog dialog = null;
    AlertDialog.Builder builder = new Builder(this);

    switch(id) {
        case DIALOG_LOAD_FILE:
            builder.setTitle("Choose your file");
            if(mFileList == null) {
                Log.e(TAG, "Showing file picker before loading the file list");
                dialog = builder.create();
                return dialog;
            }
            builder.setItems(mFileList, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    mChosenFile = mFileList[which];
                    //you can do stuff with the file here too
                }
            });
            break;
    }
    dialog = builder.show();
    return dialog;
}
 

J'espère que cela t'aides!

73voto

Kirill Mikhailov Points 611

Merci schwiz pour idée! Voici la solution modifiée:

              public class FileDialog {
                private static final String PARENT_DIR = "..";
                private final String TAG = getClass().getName();
                private String[] fileList;
                private File currentPath;
                public interface FileSelectedListener {
                    void fileSelected(File file);
                }
                public interface DirectorySelectedListener {
                    void directorySelected(File directory);
                }
                private ListenerList<FileSelectedListener> fileListenerList = new ListenerList<FileDialog.FileSelectedListener>();
                private ListenerList<DirectorySelectedListener> dirListenerList = new ListenerList<FileDialog.DirectorySelectedListener>();
                private final Activity activity;
                private boolean selectDirectoryOption;
                private String fileEndsWith;    

                /**
                 * @param activity 
                 * @param initialPath
                 */
                public FileDialog(Activity activity, File path) {
                    this.activity = activity;
                    if (!path.exists()) path = Environment.getExternalStorageDirectory();
                    loadFileList(path);
                }

                /**
                 * @return file dialog
                 */
                public Dialog createFileDialog() {
                    Dialog dialog = null;
                    AlertDialog.Builder builder = new AlertDialog.Builder(activity);

                    builder.setTitle(currentPath.getPath());
                    if (selectDirectoryOption) {
                        builder.setPositiveButton("Select directory", new OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                Log.d(TAG, currentPath.getPath());
                                fireDirectorySelectedEvent(currentPath);
                            }
                        });
                    }

                    builder.setItems(fileList, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            String fileChosen = fileList[which];
                            File chosenFile = getChosenFile(fileChosen);
                            if (chosenFile.isDirectory()) {
                                loadFileList(chosenFile);
                                dialog.cancel();
                                dialog.dismiss();
                                showDialog();
                            } else fireFileSelectedEvent(chosenFile);
                        }
                    });

                    dialog = builder.show();
                    return dialog;
                }


                public void addFileListener(FileSelectedListener listener) {
                    fileListenerList.add(listener);
                }

                public void removeFileListener(FileSelectedListener listener) {
                    fileListenerList.remove(listener);
                }

                public void setSelectDirectoryOption(boolean selectDirectoryOption) {
                    this.selectDirectoryOption = selectDirectoryOption;
                }

                public void addDirectoryListener(DirectorySelectedListener listener) {
                    dirListenerList.add(listener);
                }

                public void removeDirectoryListener(DirectorySelectedListener listener) {
                    dirListenerList.remove(listener);
                }

                /**
                 * Show file dialog
                 */
                public void showDialog() {
                    createFileDialog().show();
                }

                private void fireFileSelectedEvent(final File file) {
                    fileListenerList.fireEvent(new FireHandler<FileDialog.FileSelectedListener>() {
                        public void fireEvent(FileSelectedListener listener) {
                            listener.fileSelected(file);
                        }
                    });
                }

                private void fireDirectorySelectedEvent(final File directory) {
                    dirListenerList.fireEvent(new FireHandler<FileDialog.DirectorySelectedListener>() {
                        public void fireEvent(DirectorySelectedListener listener) {
                            listener.directorySelected(directory);
                        }
                    });
                }

                private void loadFileList(File path) {
                    this.currentPath = path;
                    List<String> r = new ArrayList<String>();
                    if (path.exists()) {
                        if (path.getParentFile() != null) r.add(PARENT_DIR);
                        FilenameFilter filter = new FilenameFilter() {
                            public boolean accept(File dir, String filename) {
                                File sel = new File(dir, filename);
                                if (!sel.canRead()) return false;
                                if (selectDirectoryOption) return sel.isDirectory();
                                else {
                                    boolean endsWith = fileEndsWith != null ? filename.toLowerCase().endsWith(fileEndsWith) : true;
                                    return endsWith || sel.isDirectory();
                                }
                            }
                        };
                        String[] fileList1 = path.list(filter);
                        for (String file : fileList1) {
                            r.add(file);
                        }
                    }
                    fileList = (String[]) r.toArray(new String[]{});
                }

                private File getChosenFile(String fileChosen) {
                    if (fileChosen.equals(PARENT_DIR)) return currentPath.getParentFile();
                    else return new File(currentPath, fileChosen);
                }

                public void setFileEndsWith(String fileEndsWith) {
                    this.fileEndsWith = fileEndsWith != null ? fileEndsWith.toLowerCase() : fileEndsWith;
                }
             }

        class ListenerList<L> {
            private List<L> listenerList = new ArrayList<L>();

            public interface FireHandler<L> {
                void fireEvent(L listener);
            }

            public void add(L listener) {
                listenerList.add(listener);
            }

            public void fireEvent(FireHandler<L> fireHandler) {
                List<L> copy = new ArrayList<L>(listenerList);
                for (L l : copy) {
                    fireHandler.fireEvent(l);
                }
            }

            public void remove(L listener) {
                listenerList.remove(listener);
            }

            public List<L> getListenerList() {
                return listenerList;
            }
        }
 

Utilisez-le sur l'activité onCreate (l'option de sélection de répertoire est commentée):

         protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            File mPath = new File(Environment.getExternalStorageDirectory() + "//DIR//");
            fileDialog = new FileDialog(this, mPath);
            fileDialog.setFileEndsWith(".txt");
            fileDialog.addFileListener(new FileDialog.FileSelectedListener() {
                public void fileSelected(File file) {
                    Log.d(getClass().getName(), "selected file " + file.toString());
                }
            });
            //fileDialog.addDirectoryListener(new FileDialog.DirectorySelectedListener() {
            //  public void directorySelected(File directory) {
            //      Log.d(getClass().getName(), "selected dir " + directory.toString());
            //  }
            //});
            //fileDialog.setSelectDirectoryOption(false);
            fileDialog.showDialog();
        }
 

15voto

sonu thomas Points 1305

J'ai créé FolderLayout qui peut vous aider. Ce lien m'a aidé

folderview.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView android:id="@+id/path" android:text="Path"
        android:layout_width="match_parent" android:layout_height="wrap_content"></TextView>
    <ListView android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:id="@+id/list"></ListView>

</LinearLayout>

FolderLayout.java

package com.testsample.activity;




   public class FolderLayout extends LinearLayout implements OnItemClickListener {

    Context context;
    IFolderItemListener folderListener;
    private List<String> item = null;
    private List<String> path = null;
    private String root = "/";
    private TextView myPath;
    private ListView lstView;

    public FolderLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        // TODO Auto-generated constructor stub
        this.context = context;


        LayoutInflater layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = layoutInflater.inflate(R.layout.folderview, this);

        myPath = (TextView) findViewById(R.id.path);
        lstView = (ListView) findViewById(R.id.list);

        Log.i("FolderView", "Constructed");
        getDir(root, lstView);

    }

    public void setIFolderItemListener(IFolderItemListener folderItemListener) {
        this.folderListener = folderItemListener;
    }

    //Set Directory for view at anytime
    public void setDir(String dirPath){
        getDir(dirPath, lstView);
    }


    private void getDir(String dirPath, ListView v) {

        myPath.setText("Location: " + dirPath);
        item = new ArrayList<String>();
        path = new ArrayList<String>();
        File f = new File(dirPath);
        File[] files = f.listFiles();

        if (!dirPath.equals(root)) {

            item.add(root);
            path.add(root);
            item.add("../");
            path.add(f.getParent());

        }
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            path.add(file.getPath());
            if (file.isDirectory())
                item.add(file.getName() + "/");
            else
                item.add(file.getName());

        }

        Log.i("Folders", files.length + "");

        setItemList(item);

    }

    //can manually set Item to display, if u want
    public void setItemList(List<String> item){
        ArrayAdapter<String> fileList = new ArrayAdapter<String>(context,
                R.layout.row, item);

        lstView.setAdapter(fileList);
        lstView.setOnItemClickListener(this);
    }


    public void onListItemClick(ListView l, View v, int position, long id) {
        File file = new File(path.get(position));
        if (file.isDirectory()) {
            if (file.canRead())
                getDir(path.get(position), l);
            else {
//what to do when folder is unreadable
                if (folderListener != null) {
                    folderListener.OnCannotFileRead(file);

                }

            }
        } else {

//what to do when file is clicked
//You can add more,like checking extension,and performing separate actions
            if (folderListener != null) {
                folderListener.OnFileClicked(file);
            }

        }
    }

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        // TODO Auto-generated method stub
        onListItemClick((ListView) arg0, arg0, arg2, arg3);
    }

}

Et une Interface IFolderItemListener ajouter que faire lorsqu'un fileItem est cliqué

IFolderItemListener.java

public interface IFolderItemListener {

    void OnCannotFileRead(File file);//implement what to do folder is Unreadable
    void OnFileClicked(File file);//What to do When a file is clicked
}

Aussi un langage xml pour définir la ligne

row.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rowtext" android:layout_width="fill_parent"
    android:textSize="23sp" android:layout_height="match_parent"/>

Comment l'Utiliser dans votre Application

Dans votre xml,

folders.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="horizontal" android:weightSum="1">
    <com.testsample.activity.FolderLayout android:layout_height="match_parent" layout="@layout/folderview"
        android:layout_weight="0.35"
        android:layout_width="200dp" android:id="@+id/localfolders"></com.testsample.activity.FolderLayout></LinearLayout>

Dans Votre Activité,

SampleFolderActivity.java

public class SampleFolderActivity extends Activity implements IFolderItemListener {

    FolderLayout localFolders;

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        localFolders = (FolderLayout)findViewById(R.id.localfolders);
        localFolders.setIFolderItemListener(this);
            localFolders.setDir("./sys");//change directory if u want,default is root   

    }

    //Your stuff here for Cannot open Folder
    public void OnCannotFileRead(File file) {
        // TODO Auto-generated method stub
        new AlertDialog.Builder(this)
        .setIcon(R.drawable.icon)
        .setTitle(
                "[" + file.getName()
                        + "] folder can't be read!")
        .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog,
                            int which) {


                    }
                }).show();

    }


    //Your stuff here for file Click
    public void OnFileClicked(File file) {
        // TODO Auto-generated method stub
        new AlertDialog.Builder(this)
        .setIcon(R.drawable.icon)
        .setTitle("[" + file.getName() + "]")
        .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int which) {


                    }

                }).show();
    }

}

Importer les bibliothèques nécessaires. Espérons que ces vous aider...

5voto

Alexey Vassiliev Points 653

A la recherche d'un fichier/dossier navigateur me suis récemment décidé de faire un nouvel explorateur de l'activité (Android bibliothèque): https://github.com/vaal12/AndroidFileBrowser

Correspondant de l'application de Test https://github.com/vaal12/FileBrowserTestApplication- est un exemple de comment l'utiliser.

Permet de sélectionner les répertoires et les fichiers de téléphone de la structure du fichier.

3voto

Edward Falk Points 3650

Ajout au mix: le gestionnaire de fichiers OI a un api public enregistré à openintents.org

http://openintents.org/en/filemanager

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X