Android文件浏览器的开发
首先在eclipse里面建立Android工程 。
1.启动Eclipse
2.右击“package explorer”并点击 “ New->Android Project ”
3.在新建工程的对话框中填写以下信息
- 工程名: FSExplorer1
- 包名: org.lombardos.android.FSExplorer1
- Activity Name: FileList
- Application Name: Filesystem Explorer
4.点击“ 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 } - 对于使用的一些imports类在eclipse下快捷键”Shift-Control-O”来组织。
- 保存你的文件并运行。这样就可以在Android电话中得到你的手机系统文件目录了。
- 当再点击却没有发生任何反应,下面的部分将解决这个问题。
1.行2-4行获取files[]数组并将每一个文件名赋予ArrayList<String>,items是一个类在后面将会用到,当用户点击每一个文件或者目录的时候。
2.第五行就是使用布局文件file_row layout将ArrayList中的数据输出到ArrayAdapter。
3. 最后第六步,将目前ArrayAdapter中的内容显示到屏幕上。
导航目录树
现在我们可以看到了根目录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)
更多相关文章
- 浅谈Java中Collections.sort对List排序的两种方法
- NPM 和webpack 的基础使用
- Python list sort方法的具体使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- python list.sort()根据多个关键字排序的方法实现
- 关于cocos2dx的eclipse的"serializing cdt project settings"解
- Android(安卓)UI系列:关于按钮点击事件
- Android常用Manager
- android使用全局变量的两种方法