文件選擇器
今天給大家分享下文件選擇器的作用 , 具體就是獲取用戶在在SD卡選中的文件/文件夾路徑 ,類似于C#中OpenFileDialog控件(對C#的一站式開發還是念念不忘)。功能實現起來比較簡單,主要是幫助大家節省開發時間。
網上流傳較廣的一個成品如下 <[Android實例] 文件選擇器>, 本文也是根據上面的成品修改而成,使其更易理解,效率更高。 除此之外,主要特色有:
1、我們監聽了用戶按下Back鍵的事件,使其返回上一層目錄;
2、針對不同的文件類型(文件vs文件夾 , 目標文件vs其他文件)做了特殊處理。
知識點一、 File 類的使用
文件選擇器的主要功能是:瀏覽文件/文件夾、文件類型等;都是通過Java File類來實現的。
知識點二、調用方法說明   
使用了startActivityForResult()發起調用以及onActivityResult()方法接受回調后的信息。
截圖如下:

其他的也沒什么好說了,大家看看代碼注釋吧~~ so easy - - 。
FileChooserActivity.java 實現文件選擇的類 。
public class CopyOfFileChooserActivity extends Activity {      private String mSdcardRootPath ; //sdcard 根路徑   private String mLastFilePath ;  //當前顯示的路徑      private ArrayList<FileInfo> mFileLists ;   private FileChooserAdapter mAdatper ;      //配置適配器   private void setGridViewAdapter(String filePath) {     updateFileItems(filePath);     mAdatper = new FileChooserAdapter(this , mFileLists);     mGridView.setAdapter(mAdatper);   }   //根據路徑更新數據,并且通知Adatper數據改變   private void updateFileItems(String filePath) {     mLastFilePath = filePath ;     mTvPath.setText(mLastFilePath);          if(mFileLists == null)       mFileLists = new ArrayList<FileInfo>() ;     if(!mFileLists.isEmpty())       mFileLists.clear() ;          File[] files = folderScan(filePath);     if(files == null)        return ;     for (int i = 0; i < files.length; i++) {       if(files[i].isHidden()) // 不顯示隱藏文件         continue ;              String fileAbsolutePath = files[i].getAbsolutePath() ;       String fileName = files[i].getName();       boolean isDirectory = false ;       if (files[i].isDirectory()){         isDirectory = true ;       }       FileInfo fileInfo = new FileInfo(fileAbsolutePath , fileName , isDirectory) ;       //添加至列表       mFileLists.add(fileInfo);     }     //When first enter , the object of mAdatper don't initialized     if(mAdatper != null)       mAdatper.notifyDataSetChanged(); //重新刷新   }   //獲得當前路徑的所有文件   private File[] folderScan(String path) {     File file = new File(path);     File[] files = file.listFiles();     return files;   }   private AdapterView.OnItemClickListener mItemClickListener = new OnItemClickListener() {     public void onItemClick(AdapterView<?> adapterView, View view, int position,         long id) {       FileInfo fileInfo = (FileInfo)(((FileChooserAdapter)adapterView.getAdapter()).getItem(position));       if(fileInfo.isDirectory())  //點擊項為文件夾, 顯示該文件夾下所有文件         updateFileItems(fileInfo.getFilePath()) ;       else if(fileInfo.isPPTFile()){ //是ppt文件 , 則將該路徑通知給調用者         Intent intent = new Intent();         intent.putExtra(EXTRA_FILE_CHOOSER, fileInfo.getFilePath());         setResult(RESULT_OK , intent);         finish();       }       else {  //其他文件.....         toast(getText(R.string.open_file_error_format));       }     }   };   public boolean onKeyDown(int keyCode , KeyEvent event){     if(event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode()       == KeyEvent.KEYCODE_BACK){       backProcess();         return true ;     }     return super.onKeyDown(keyCode, event);   }   //返回上一層目錄的操作   public void backProcess(){     //判斷當前路徑是不是sdcard路徑 , 如果不是,則返回到上一層。     if (!mLastFilePath.equals(mSdcardRootPath)) {        File thisFile = new File(mLastFilePath);       String parentFilePath = thisFile.getParent();       updateFileItems(parentFilePath);     }      else {  //是sdcard路徑 ,直接結束       setResult(RESULT_CANCELED);       finish();     }   } } 界面依舊很丑陋, 主站蜘蛛池模板: 耿马| 郯城县| 灌阳县| 印江| 东方市| 蓬莱市| 扎赉特旗| 楚雄市| 塔城市| 钟山县| 浑源县| 晋城| 金昌市| 彭州市| 苏尼特左旗| 沾化县| 巩义市| 囊谦县| 土默特左旗| 资源县| 习水县| 尼玛县| 舒兰市| 邮箱| 紫阳县| 河北区| 华安县| 屏东县| 新津县| 张北县| 沙洋县| 丰县| 阳西县| 定边县| 洛川县| 延边| 宜良县| 揭西县| 通河县| 峡江县| SHOW|