选择文件对话框有谁知道完整的选择文件对话框?也许您可以过滤掉除具有特定扩展名的文件之外的所有文件?我没有发现任何足够轻量的东西可以很容易地实现我的一个项目。唯一的其他选择似乎是使用OI FileManager的开放意图,但这需要用户已经安装了文件管理器。如果有人能指出允许用户浏览文件夹并选择文件并返回路径的Dialog,我将不胜感激。
3 回答
ABOUTYOU
TA贡献1812条经验 获得超5个赞
Thanx schwiz的想法!这是修改后的解决方案
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 initialPath) { this(activity, initialPath, null); } public FileDialog(Activity activity, File initialPath, String fileEndsWith) { this.activity = activity; setFileEndsWith(fileEndsWith); if (!initialPath.exists()) initialPath = Environment.getExternalStorageDirectory(); loadFileList(initialPath); } /** * @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); } private 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; }}
在onCreate上使用它(注释目录选择选项):
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); File mPath = new File(Environment.getExternalStorageDirectory() + "//DIR//"); fileDialog = new FileDialog(this, mPath, ".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();}
- 3 回答
- 0 关注
- 754 浏览
添加回答
举报
0/150
提交
取消