选择文件对话框

有人知道一个完整的选择文件对话框吗?也许你可以过滤掉所有的文件,除了那些有特定扩展名的文件?

我还没有发现任何足够轻量级的东西可以轻松地实现到我的一个项目中。唯一的其他选项似乎是使用 OI FileManager 的开放意图,但这需要用户已经安装了文件管理器。

如果有人能指出一个对话框,允许用户浏览文件夹和选择一个文件,并返回路径,我将非常感激。

167411 次浏览

您只需覆盖活动中的 onCreateDialog

//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;
}

我已经创建了 FolderLayout可能会帮助你。 这个 链接帮了我

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);
}


}

以及一个接口 IFolderItemListener,用于在单击 fileItem时添加要执行的操作

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
}

还有一个用于定义行的 xml

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"/>

如何在应用程序中使用

在 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>

在你的活动中,

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();
}


}

导入所需的库。希望这些对您有所帮助..。

最近我正在寻找一个文件/文件夹浏览器,并决定做一个新的浏览器活动(Android 库) : Https://github.com/vaal12/androidfilebrowser

匹配测试应用程序 < a href = “ https://github.com/vaal12/FileBrowserTestApplication-”rel = “ norefrer”> https://github.com/vaal12/filebrowsertestapplication- 是如何使用。

允许从电话文件结构中挑选目录和文件。

添加到混合: OI 文件管理器有一个在 openintents.org 注册的公共 api

Http://www.openintents.org/filemanager

Http://www.openintents.org/action/org-openintents-action-pick-file/

感谢施威兹的想法! 这里是修改后的解决方案:

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;
}
}

在 activity 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();
}

我已经实现了三星文件选择器对话框,它提供了能力,打开,保存文件,文件扩展过滤器,并在同一个对话框中创建新的目录 我觉得值得一试 这是 林克 你必须登录到三星开发者网站来查看解决方案