zoukankan      html  css  js  c++  java
  • Android文件选择器的实例分享

         本文给大家讲解下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。

  • 相关阅读:
    ASP.NET 2.0 中的主版頁面 Master Pages
    初探ERP的数据库框架
    node.js 入门,
    mysql 测试
    zendframework 内置view
    session.save_Handler
    读mysql技术内幕 InnoDB 第三章
    php 的命名空间 看鸟哥后的随笔
    mysql innodb技术内幕 ~读 1,2,3 复习
    php 无乱码截取中文
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3938732.html
Copyright © 2011-2022 走看看