本文给大家讲解下Android文件选择器的使用。实际上就是获取用户在SD卡中选择的文件或文件夹的路径,这很像C#中的OpenFileDialog控件。

       此实例的实现过程很简单,这样可以让大家快速的熟悉Android文件选择器,提高开发效率。

       网上曾经见到过一个关于文件选择器的实例,很多人都看过,本实例是根据它修改而成的,但更容易理解,效率也更高,另外,本实例有自己的特点:

       1、监听了用户按下Back键的事件,使其返回上一层目录。

       2、针对不同的文件类型(文件vs文件夹 , 目标文件vs其他文件)做了特殊处理。

       知识点一、 File 类的使用

       文件选择器的主要功能是:浏览文件\文件夹、文件类型等;都是通过Java File类来实现的。

       知识点二、调用方法说明   

       使用了startActivityForResult()发起调用以及onActivityResult()方法接收回调后的信息。

       先贴上效果图如下:

Android文件选择器的实例分享

       其他的也没什么好说了,大家看看代码注释吧,很简单。

       FileChooserActivity.java 实现文件选择的类 。

Java代码
  1. public class CopyOfFileChooserActivity extends Activity {  
  2.       
  3.     private String mSdcardRootPath ;  //sdcard 根路径  
  4.     private String mLastFilePath ;    //当前显示的路径  
  5.       
  6.     private ArrayList<FileInfo> mFileLists  ;  
  7.     private FileChooserAdapter mAdatper ;  
  8.       
  9.     //配置适配器  
  10.     private void setGridViewAdapter(String filePath) {  
  11.         updateFileItems(filePath);  
  12.         mAdatper = new FileChooserAdapter(this , mFileLists);  
  13.         mGridView.setAdapter(mAdatper);  
  14.     }  
  15.     //根据路径更新数据,并且通知Adatper数据改变  
  16.     private void updateFileItems(String filePath) {  
  17.         mLastFilePath = filePath ;  
  18.         mTvPath.setText(mLastFilePath);  
  19.           
  20.         if(mFileLists == null)  
  21.             mFileLists = new ArrayList<FileInfo>() ;  
  22.         if(!mFileLists.isEmpty())  
  23.             mFileLists.clear() ;  
  24.           
  25.         File[] files = folderScan(filePath);  
  26.         if(files == null)   
  27.             return ;  
  28.         for (int i = 0; i < files.length; i++) {  
  29.             if(files[i].isHidden())  // 不显示隐藏文件  
  30.                 continue ;  
  31.               
  32.             String fileAbsolutePath = files[i].getAbsolutePath() ;  
  33.             String fileName = files[i].getName();  
  34.             boolean isDirectory = false ;  
  35.             if (files[i].isDirectory()){  
  36.                 isDirectory = true ;  
  37.             }  
  38.             FileInfo fileInfo = new FileInfo(fileAbsolutePath , fileName , isDirectory) ;  
  39.             //添加至列表  
  40.             mFileLists.add(fileInfo);  
  41.         }  
  42.         //When first enter , the object of mAdatper don't initialized  
  43.         if(mAdatper != null)  
  44.             mAdatper.notifyDataSetChanged();  //重新刷新  
  45.     }  
  46.     //获得当前路径的所有文件  
  47.     private File[] folderScan(String path) {  
  48.         File file = new File(path);  
  49.         File[] files = file.listFiles();  
  50.         return files;  
  51.     }  
  52.     private AdapterView.OnItemClickListener mItemClickListener = new OnItemClickListener() {  
  53.         public void onItemClick(AdapterView<?> adapterView, View view, int position,  
  54.                 long id) {  
  55.             FileInfo fileInfo = (FileInfo)(((FileChooserAdapter)adapterView.getAdapter()).getItem(position));  
  56.             if(fileInfo.isDirectory())   //点击项为文件夹, 显示该文件夹下所有文件  
  57.                 updateFileItems(fileInfo.getFilePath()) ;  
  58.             else if(fileInfo.isPPTFile()){  //是ppt文件 , 则将该路径通知给调用者  
  59.                 Intent intent = new Intent();  
  60.                 intent.putExtra(EXTRA_FILE_CHOOSER, fileInfo.getFilePath());  
  61.                 setResult(RESULT_OK , intent);  
  62.                 finish();  
  63.             }  
  64.             else {   //其他文件.....  
  65.                 toast(getText(R.string.open_file_error_format));  
  66.             }  
  67.         }  
  68.     };  
  69.     public boolean onKeyDown(int keyCode , KeyEvent event){  
  70.         if(event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode()  
  71.             == KeyEvent.KEYCODE_BACK){  
  72.             backProcess();     
  73.             return true ;  
  74.         }  
  75.         return super.onKeyDown(keyCode, event);  
  76.     }  
  77.     //返回上一层目录的操作  
  78.     public void backProcess(){  
  79.         //判断当前路径是不是sdcard路径 , 如果不是,则返回到上一层。  
  80.         if (!mLastFilePath.equals(mSdcardRootPath)) {    
  81.             File thisFile = new File(mLastFilePath);  
  82.             String parentFilePath = thisFile.getParent();  
  83.             updateFileItems(parentFilePath);  
  84.         }   
  85.         else {   //是sdcard路径 ,直接结束  
  86.             setResult(RESULT_CANCELED);  
  87.             finish();  
  88.         }  
  89.     }  
  90. }  

       此实例的界面稍显简陋,不过大家可以在此基础上完善,添加其他功能。本实例代码下载地址:http://download.csdn.net/detail/qinjuning/4825392。

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/316.html
2012年12月14日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:0