Android的数据存储和IO-SD卡文件浏览器


Android的数据存储和IO-SD卡文件浏览器

创建项目:SDFileExplorer

运行项目结果:

布局文件:main.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <!-- 显示当前路径的的文本框 -->  
  8. <TextView    
  9.     android:id="@+id/path"  
  10.     android:layout_width="fill_parent"   
  11.     android:layout_height="wrap_content"   
  12.     android:layout_gravity="center_horizontal"   
  13.     />  
  14. <!-- 列出当前路径下所有文件的ListView -->  
  15. <ListView    
  16.     android:id="@+id/list"  
  17.     android:layout_width="wrap_content"   
  18.     android:layout_height="wrap_content"   
  19.     android:divider="#000"  
  20.     />  
  21. <!-- 返回上一级目录的按钮 -->  
  22. <Button android:id="@+id/parent"  
  23.     android:layout_width="wrap_content"   
  24.     android:layout_height="wrap_content"   
  25.     android:background="@drawable/home"  
  26.     android:paddingTop="20dp"  
  27.     android:layout_gravity="center"/>  
  28. </LinearLayout>  

列表布局文件: line.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >      
  7. <!-- 定义一个ImageView,用于作为列表项的一部分。 -->  
  8. <ImageView android:id="@+id/icon"  
  9.     android:layout_width="wrap_content"  
  10.     android:layout_height="wrap_content"   
  11.     android:paddingLeft="10dp"  
  12.     />  
  13. <!-- 定义一个TextView,用于作为列表项的一部分。 -->  
  14. <TextView android:id="@+id/file_name"  
  15.     android:layout_width="wrap_content"   
  16.     android:layout_height="wrap_content"  
  17.     android:textSize="16dp"  
  18.     android:gravity="center_vertical"  
  19.     android:paddingLeft="10dp"  
  20.     android:paddingTop="10dp"  
  21.     android:paddingBottom="10dp"      
  22.     />     
  23. </LinearLayout>  

Activity文件:SDFileExplorer.java

  1. package wwj.sdfileexplorer;  
  2.   
  3. import java.io.File;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import android.app.Activity;  
  10. import android.os.Bundle;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.AdapterView;  
  14. import android.widget.AdapterView.OnItemClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.ListView;  
  17. import android.widget.SimpleAdapter;  
  18. import android.widget.TextView;  
  19. import android.widget.Toast;  
  20.   
  21. public class SDFileExplorer extends Activity {  
  22.       
  23.     ListView listView;  
  24.     TextView textView;  
  25.     //记录当前的父文件夹   
  26.     File currentParent;  
  27.     //记录当前目录路径下的所有文件的文件数组   
  28.     File[] currentFiles;  
  29.     @Override  
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.main);  
  33.         //获取列出全部文件的ListView   
  34.         listView = (ListView)findViewById(R.id.list);  
  35.         textView = (TextView)findViewById(R.id.path);  
  36.         //获取系统的SD卡的目录   
  37.         File root = new File("/mnt/sdcard/");  
  38.         //如果SD卡存在   
  39.         if(root.exists()){  
  40.             currentParent = root;  
  41.             currentFiles = root.listFiles();  
  42.             //使用当前目录下的全部文件、文件夹来填充ListView   
  43.             inflateListView(currentFiles);  
  44.         }  
  45.         //为ListView的列表项的单击事件绑定监听器   
  46.         listView.setOnItemClickListener(new OnItemClickListener() {  
  47.   
  48.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  49.                     long arg3) {  
  50.                 // TODO Auto-generated method stub   
  51.                 //用户单击了文件,直接返回,不做任何处理   
  52.                 if(currentFiles[arg2].isFile())  
  53.                     return;  
  54.                 //获取用户单击的文件夹下的所有文件   
  55.                 File[] tmp = currentFiles[arg2].listFiles();  
  56.                 if(tmp == null || tmp.length == 0){  
  57.                     Toast.makeText(SDFileExplorer.this"当前路径不可访问或该路径下没有文件"20000).show();  
  58.                 }  
  59.                 else{  
  60.                     //获取用户单击的列表项对应的文件夹,设为当前的父文件夹   
  61.                     currentParent = currentFiles[arg2];  
  62.                     //保存当前的父文件夹内的全部文件和文件夹   
  63.                     currentFiles = tmp;  
  64.                     //再次更新ListView   
  65.                     inflateListView(currentFiles);  
  66.                 }  
  67.             }  
  68.         });  
  69.         //获取上一级目录的按钮   
  70.         Button parent = (Button)findViewById(R.id.parent);  
  71.         parent.setOnClickListener(new OnClickListener() {  
  72.               
  73.             public void onClick(View v) {  
  74.                 // TODO Auto-generated method stub   
  75.                 try{  
  76.                     if(!currentParent.getCanonicalPath().equals("/mnt/sdcard")){  
  77.                         //获取上级目录   
  78.                         currentParent = currentParent.getParentFile();  
  79.                         //列出当前目录下所有文件   
  80.                         currentFiles = currentParent.listFiles();  
  81.                         //再次更新ListView   
  82.                         inflateListView(currentFiles);  
  83.                     }  
  84.                 }catch (Exception e) {  
  85.                     // TODO: handle exception   
  86.                     e.printStackTrace();  
  87.                 }  
  88.             }  
  89.         });  
  90.     }  
  91.     private void inflateListView(File[] files){  
  92.         //创建一个List集合,List集合的元素是Map   
  93.         List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();  
  94.         for(int i = 0; i < files.length; i++){  
  95.             Map<String, Object> listItem = new HashMap<String, Object>();  
  96.             //如果当前File是文件夹,使用floder图标;否则使用file图标   
  97.             if(files[i].isDirectory()){  
  98.                 listItem.put("icon", R.drawable.folder);  
  99.             }  
  100.             else{  
  101.                 listItem.put("icon", R.drawable.file);  
  102.             }  
  103.             listItem.put("fileName", files[i].getName());  
  104.             //添加List项   
  105.             listItems.add(listItem);  
  106.         }  
  107.         //创建一个SimpleAdapter   
  108.         SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line,   
  109.                 new String[]{"icon","fileName"}, new int[]{R.id.icon, R.id.file_name});  
  110.         //为ListView设置Adapter   
  111.         listView.setAdapter(simpleAdapter);  
  112.         try{  
  113.             textView.setText("当前路径为: " + currentParent.getCanonicalPath());  
  114.         }catch (Exception e) {  
  115.             // TODO: handle exception   
  116.             e.printStackTrace();  
  117.         }  
  118.     }  
  119. }  

相关内容