网络112 柳内恒
用Android手机的朋友都知道有些软件对于用户来说是必不可少的,因为少了它们的存在我们用户用起来就很不方便。比如说文件管理器就是一个比较典型的一个软件,因为我们少了它就不方便管理我们手机中的一些文件资料,对于用户来说这必然是一大遗憾。今天我们就来相互讨论一下简单文件管理器的开发。
一、界面设计需要
1、 在主界面(main.xml)加入一个TextView、Button、ListView控件,它们分别用于表示当前路径、返回上级路径、显示当前路径下的所有文件与文件夹。效果图如下所示:
2、 新建一个(item.xml)文件,加入一个ImageView和两个TextView控件,它们分别用于表示当前文件是否为文件夹、其中一个TextView用于显示文件名称,另外一个用于显示该文件大小。由于时间关系这里我们就没有做显示文件大小功能。效果图如下:
3、 整个程序运行时的效果图如下所显:
二、程序设计
1、 我们以LiuneihengActivity.java为主程序入口,首先我们将该界面的一些控件加以定义及注册。代码如下:
1 public void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.main); 4 t1=(TextView) findViewById(R.id.t1);//注册TextView控件 5 lv=(ListView) findViewById(R.id.listView1);//注册ListView控件 6 btnUp=(Button) findViewById(R.id.btnUp);//注册按钮控件 7 FileListAdapter da=new FileListAdapter(this); 8 lv.setAdapter(da); 9 lv.setOnItemClickListener(this);//为ListView添加侦听器 10 da.scanFiles("/"); 11 btnUp.setOnClickListener(this);//为按钮添加侦听器 12 } 13 ListView lv;//定义ListView控件 14 TextView t1;//定义TextView控件 15 Button btnUp;//定义按钮控件 16 }
2、 编写“向上”按钮的点击事件,使用程序返回上一级目录。代码如下:
1 public void onClick(View arg0) { 2 //按钮点击事件 3 FileListAdapter da=(FileListAdapter) lv.getAdapter(); 4 if(da.currPath.equals("/")) return; 5 File f=new File(da.currPath); 6 t1.setText(f.getParent());//显示返回上一路径 7 da.scanFiles(f.getParent()); 8 }
3、编写ListView控件的点击事件,当用户点击一个文件夹的时候就进入此文件夹的目录下。代码如下:
1 public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 2 // TODO Auto-generated method stub 3 FileListAdapter da=(FileListAdapter) lv.getAdapter(); 4 File f=da.list.get(position); 5 if(f.isDirectory()) 6 { 7 t1.setText(f.getPath());//显示当前路径 8 da.scanFiles(f.getPath()); 9 } 10 }
4、 新一个FileListAdapter.java文件,在新建的时候一定要继承“BaseAdapter”包。新建完成后将会自动生成一段代码,其修改后如下。
1 public int getCount() { 2 // TODO Auto-generated method stub 3 return list.size();//获取文件数 4 } 5 6 @Override 7 public Object getItem(int arg0) { 8 // TODO Auto-generated method stub 9 return null; 10 } 11 12 @Override 13 public long getItemId(int position) { 14 // TODO Auto-generated method stub 15 return position; 16 } 17 18 @Override 19 public View getView(int position, View arg1, ViewGroup arg2) { 20 // TODO Auto-generated method stub 21 View v=View.inflate(activity, R.layout.item, null); 22 TextView txtName=(TextView) v.findViewById(R.id.txtName);//将获取到的名字转换成TextView显示 23 ImageView imgIcon=(ImageView) v.findViewById(R.id.imgIcon);//将获取到的文件类型转换成ImageView显示 24 File f=list.get(position);//获取文件数 25 txtName.setText(f.getName());//显示文件名 26 if(f.isDirectory()) 27 imgIcon.setImageBitmap(bmp_folder);//ImageView将显示文件夹图标 28 else 29 imgIcon.setImageBitmap(bmp_file);//ImageView将显示文件图标 30 return v; 31 }
5、 定义各类型变量及编写FileListAdapter和scanFiles方法。
1 public int getCount() { 2 // TODO Auto-generated method stub 3 return list.size();//获取文件数 4 } 5 6 @Override 7 public Object getItem(int arg0) { 8 // TODO Auto-generated method stub 9 return null; 10 } 11 12 @Override 13 public long getItemId(int position) { 14 // TODO Auto-generated method stub 15 return position; 16 }
6、 编写getView方法,用于实现当前路径下的所有文件及文件夹的图标、文件名称、文件大小等信息。代码如下:
1 public View getView(int position, View arg1, ViewGroup arg2) { 2 // TODO Auto-generated method stub 3 View v=View.inflate(activity, R.layout.item, null); 4 TextView txtName=(TextView) v.findViewById(R.id.txtName);//将获取到的名字转换成TextView显示 5 ImageView imgIcon=(ImageView) v.findViewById(R.id.imgIcon);//将获取到的文件类型转换成ImageView显示 6 File f=list.get(position);//获取文件数 7 txtName.setText(f.getName());//显示文件名 8 if(f.isDirectory()) 9 imgIcon.setImageBitmap(bmp_folder);//ImageView将显示文件夹图标 10 else 11 imgIcon.setImageBitmap(bmp_file);//ImageView将显示文件图标 12 return v; 13 }
三、感悟
这次的简单文件管理器虽然简单,但是也花了我不少的时间。其中只要注意其中几个小细节就应该没什么问题。就像我在做的过程就遇到了,能正确访问到一个文件里的所有内容,但当点击“向上”按钮时对没有任何反应。开始以为是系统没有侦听到按钮控件,后来经过自己的测试以后发现不是这个原因。经过老师的指点发现是我自己把getParent()方法写错了,导致管理器一直停留在当前路径,以致于无法成功返回上一级目录。