首先在eclipse里面建立Android工程 。 1.启动Eclipse 2.右击“package explorer”并点击 “ New->Android Project ” 3.在新建工程的对话框中填写以下信息
工程名: FSExplorer1 包名: org.lombardos.android.FSExplorer1 Activity Name: FileList Application Name: Filesystem Explorer4.点击“ Finish”完成新建工程的对话框。
显示根文件系统 下一步是去修改FileList文件使根目录下的文件和目录可以显示出来。这一步类似我们在记事本中显示内容,不同之处就在于这里不是从SQL数据库数据库中显示数据而是直接获取的Android系统文件。
增加一个字符变量”no_files”到”res/values/strings.xml”文件中。这个变量的值是”This directory is empty”,当没有文件或者子目录在当前目录下这个值就会显示出来。 创建一个新的布局文件命名为directory_list.xml。此文件的内容如下。注意他的格式必须符合google官方给出的规范(参考 first exercise 的第四步)。<?xml version=”1.0″ encoding=”utf-8″?> <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”wrap_content” android:layout_height=”wrap_content”> <ListView id=”@id/android:list” android:layout_width=”wrap_content” android:layout_height=”wrap_content”/> <TextView id=”@id/android:empty” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”@string/no_files”/> </LinearLayout> 创建另外一个布局文件file_row.xml。文件的内容如下。文件的格式规范参考( first exercise 第五步)。 <?xml version=”1.0″ encoding=”utf-8″?> <TextView id=”@+id/text1″ xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”wrap_content” android:layout_height=”wrap_content”/> 这个布局文件用来显示目录下的每一个子目录和文件的列表。 修改函数文件FileList.java 中的onCreate() 如下: public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.directory_list); fill(new File(”/”).listFiles()); } 我们修改setContentView()的第一个参数为“R.layout.directory_list”,以便类似”Mp3s”这样的列表界面显示而取代原来”main”参数的主界面的显示。另外我们需要增加一个方法fill(),这个方法在后面介绍。 改变类FileList的扩展基类,由原来的”Activity”改为”ListActivity”,如下: public class FileList extends ListActivity { 为类”FileList”创建一个私有变量用来显示当前目录下的列表条目。 private List<String> items = null; 内部方法fill()的参数是File[]数组,用于在屏幕的列表中显示每个文件和目录的名字。 1 private void fill(File[] files) { 2 items = new ArrayList<String>(); 3 for( File file : files ) 4 items.add(file.getPath()); 5 ArrayAdapter<String> fileList = new ArrayAdapter<String>(this, R.layout.file_row, items); 6 setListAdapter(fileList); 7 }1.行2-4行获取files[]数组并将每一个文件名赋予ArrayList<String>,items是一个类在后面将会用到,当用户点击每一个文件或者目录的时候。 2.第五行就是使用布局文件file_row layout将ArrayList中的数据输出到ArrayAdapter。 3. 最后第六步,将目前ArrayAdapter中的内容显示到屏幕上。
对于使用的一些imports类在eclipse下快捷键”Shift-Control-O”来组织。 保存你的文件并运行。这样就可以在Android电话中得到你的手机系统文件目录了。 当再点击却没有发生任何反应,下面的部分将解决这个问题。导航目录树 现在我们可以看到了根目录root中的目录结构,那么是否可以显示每个子目录中的结构。
首先是我们需要一个返回的导航到目录树的根部即root,否则我们会发现进入目录后无法返回。最快的解决 方案就是在每个目录下都安排一个返回根目录的导航。实施起来第一步就是增加一个string变量在strings.xml文件中,他的name必须是 ”to_top”,而值可以是”[Back to Top]“。 下一步就是需要增加这个”to_top”到fill()函数的item列表中。在代码 “items = new ArrayList<String>(); “行后面增加items.add(getString(R.string.to_top));注意:类当中的静态变量的调用采用getString(R.string.<name>) 方法是比较合适的。将这些静态变量移到资源目录下可以规范你的代码。
当用户点击列表条目时候,我们就有机会截取点击并且做点有趣的事情了。为了达到这个目的,我们需要覆写ListActivity类的onListItemClick()方法。如下:1 @Override 2 protected void onListItemClick(ListView l, View v, int position, long id) { 3 int selectionRowID = (int)getSelectionRowID(); 4 if (selectionRowID==0){ 5 fillWithRoot(); 6 } else { 7 File file = new File(items.get(selectionRowID)); 8 if (file.isDirectory()) 9 fill(file.listFiles()); 10 else 11 AlertDialog.show(this, “Not a Directory”, “That’s a file, not a directory”, “Cancel”, false); 12 } 13 } Notes:
第三行显示用户点击的列表行号。第五行,如果用户选择的RowID为0,则返回到根目录列表。第九行,表示进入到用户选择的目录列表。第十一行,显示一些错误信息。 现在我们需要创建 fillWithRoot() 方法。作用类似onCreate()方法的最后一行:private void fillWithRoot() { fill(new File(”/”).listFiles()); }
不要忘记使用fillWithRoot()方法替换onCteate()方法中的fill()方法这个项目完整的源代码可以从这里下载获得, 下载 (32K Zip archive)
