【问题标题】:Android file choose dialog againAndroid文件再次选择对话框
【发布时间】:2013-04-03 10:59:35
【问题描述】:

我和这篇文章有完全相同的问题 Choose File Dialog

我在那里没有看到任何真正有用的答案。

理想情况下,我想要一个类似 MFC CFileDialog 类的简单对话框的简单 java 代码示例,即您只需新建它,执行 .show 即可工作

到目前为止,我所看到的一切看起来都过于复杂,而这本来应该是一项非常简单的工作。任何人都可以提供更多最新信息吗?

谢谢

更新,

在那篇文章中 Choose File Dialog 经过几分钟的测试,Kirill Mikhailov 的答案似乎运行良好

【问题讨论】:

    标签: android filechooser


    【解决方案1】:

    我在该示例中添加了一个取消按钮,似乎可以正常工作

    import java.io.File;
    import java.io.FilenameFilter;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.design2112.tabtrax.ListenerList.FireHandler;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.DialogInterface;
    import android.os.Environment;
    
    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, String path) {
            this.activity = activity; 
            loadFileList(new File(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);
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) { 
                    dialog.dismiss();
                }
            });
            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;
        }
    }
    

    【讨论】:

    • 我也需要一个文件对话框,并且是应用程序开发的新手。此代码是否进入活动?或者我该如何使用它?
    猜你喜欢
    • 2014-04-01
    • 2017-10-21
    • 1970-01-01
    • 2011-04-05
    • 2011-04-29
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多