Android應用中實現選擇本地檔案與目錄的執行個體分享_Android

來源:互聯網
上載者:User

檔案選取器
今天給大家分享下檔案選取器的作用 , 具體就是擷取使用者在在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();     }   } } 

介面依舊很醜陋,囧 ,大家可以根據需要在此基礎上添加功能,下面選擇目錄也基本上同理。

目錄選取器

chooserdialog.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_parent"   >    <LinearLayout     android:orientation="horizontal"     android:layout_width="fill_parent"     android:layout_height="40dip">   <Button      android:layout_width="40dip"      android:layout_height="40dip"     android:text="HOME"     android:id="@+id/btn_home"      android:layout_gravity="left"     android:layout_weight="1"   />   <LinearLayout android:layout_width="140dip"      android:layout_height="35dip"      android:id="@+id/dir_layout"     android:gravity="center"     android:layout_weight="1">     </LinearLayout>   <!-- <TextView      android:layout_width="140dip"      android:layout_height="35dip"      android:id="@+id/dir_str"     android:gravity="center"     android:layout_weight="1"   /> -->   <Button      android:layout_width="40dip"      android:layout_height="40dip"     android:text="BACK"     android:id="@+id/btn_back"      android:layout_gravity="right"     android:layout_weight="1"   />   </LinearLayout>   <ListView      android:layout_width="fill_parent"     android:layout_height="300dip"     android:id="@+id/list_dir"   />   <Button      android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:id="@+id/btn_ok"     android:text="OK"/> </LinearLayout> 
package hkp.dirchooser;import java.io.File; import java.util.ArrayList; import java.util.List;  import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.view.Gravity; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast;  public class DirChooserDialog extends Dialog implements android.view.View.OnClickListener{      private ListView list;   ArrayAdapter<String> Adapter;   ArrayList<String> arr=new ArrayList<String>();      Context context;   private String path;      private TextView title;   private EditText et;   private Button home,back,ok;   private LinearLayout titleView;      private int type = 1;   private String[] fileType = null;      public final static int TypeOpen = 1;   public final static int TypeSave = 2;      /**    * @param context    * @param type 值為1表示建立開啟目錄類型的對話方塊,2為建立儲存檔案到目錄類型的對話方塊    * @param fileType 要過濾的檔案類型,null表示只選擇目錄    * @param resultPath 點OK按鈕返回的結果,目錄或者目錄+檔案名稱    */   public DirChooserDialog(Context context,int type,String[]fileType,String resultPath) {     super(context);     // TODO Auto-generated constructor stub     this.context = context;     this.type = type;     this.fileType = fileType;     this.path = resultPath;   }   /* (non-Javadoc)    * @see android.app.Dialog#dismiss()    */   @Override   public void dismiss() {     // TODO Auto-generated method stub     super.dismiss();   }   /* (non-Javadoc)    * @see android.app.Dialog#onCreate(android.os.Bundle)    */   @Override   protected void onCreate(Bundle savedInstanceState) {     // TODO Auto-generated method stub     super.onCreate(savedInstanceState);     setContentView(R.layout.chooserdialog);          path = getRootDir();     arr = (ArrayList<String>) getDirs(path);     Adapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1, arr);          list = (ListView)findViewById(R.id.list_dir);     list.setAdapter(Adapter);          list.setOnItemClickListener(lvLis);      home = (Button) findViewById(R.id.btn_home);     home.setOnClickListener(this);          back = (Button) findViewById(R.id.btn_back);     back.setOnClickListener(this);          ok = (Button) findViewById(R.id.btn_ok);     ok.setOnClickListener(this);          titleView = (LinearLayout) findViewById(R.id.dir_layout);          if(type == TypeOpen){       title = new TextView(context);       titleView.addView(title);       title.setText(path);     }else if(type == TypeSave){       et = new EditText(context);       et.setWidth(240);       et.setHeight(70);       et.setGravity(Gravity.CENTER);       et.setPadding(0, 2, 0, 0);       titleView.addView(et);       et.setText("wfFileName");     } //   title = (TextView) findViewById(R.id.dir_str); //   title.setText(path);        }   //動態更新ListView   Runnable add=new Runnable(){      @Override     public void run() {       // TODO Auto-generated method stub       arr.clear(); //System.out.println("Runnable path:"+path);        //必須得用這種方法為arr賦值才能更新       List<String> temp = getDirs(path);       for(int i = 0;i < temp.size();i++)         arr.add(temp.get(i));       Adapter.notifyDataSetChanged();     }       };      private OnItemClickListener lvLis=new OnItemClickListener(){     @Override     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,         long arg3) {       String temp = (String) arg0.getItemAtPosition(arg2); //System.out.println("OnItemClick path1:"+path);             if(temp.equals(".."))         path = getSubDir(path);       else if(path.equals("/"))         path = path+temp;       else         path = path+"/"+temp;        //System.out.println("OnItemClick path2"+path);        if(type == TypeOpen)         title.setText(path);              Handler handler=new Handler();       handler.post(add);     }   };      private List<String> getDirs(String ipath){     List<String> file = new ArrayList<String>(); //System.out.println("GetDirs path:"+ipath);         File[] myFile = new File(ipath).listFiles();     if(myFile == null){       file.add("..");            }else       for(File f: myFile){         //過濾目錄         if(f.isDirectory()){           String tempf = f.toString();           int pos = tempf.lastIndexOf("/");           String subTemp = tempf.substring(pos+1, tempf.length()); //         String subTemp = tempf.substring(path.length(),tempf.length());           file.add(subTemp);  //System.out.println("files in dir:"+subTemp);         }         //過濾知道類型的檔案         if(f.isFile() && fileType != null){           for(int i = 0;i< fileType.length;i++){             int typeStrLen = fileType[i].length();                          String fileName = f.getPath().substring(f.getPath().length()- typeStrLen);             if (fileName.toLowerCase().equals(fileType[i])) {               file.add(f.toString().substring(path.length()+1,f.toString().length()));               }           }         }       }          if(file.size()==0)       file.add("..");      //   System.out.println("file[0]:"+file.get(0)+" File size:"+file.size());     return file;   }   /* (non-Javadoc)    * @see android.view.View.OnClickListener#onClick(android.view.View)    */   @Override   public void onClick(View v) {     // TODO Auto-generated method stub     if(v.getId() == home.getId()){       path = getRootDir();       if(type == TypeOpen)         title.setText(path);             Handler handler=new Handler();       handler.post(add);     }else if(v.getId() == back.getId()){       path = getSubDir(path);       if(type == TypeOpen)         title.setText(path);             Handler handler=new Handler();       handler.post(add);     }else if(v.getId() == ok.getId()){       dismiss();       if(type == TypeSave)         path = path+"/"+et.getEditableText().toString()+".wf";       Toast.makeText(context, path, Toast.LENGTH_SHORT).show();     }               }      private String getSDPath(){        File sdDir = null;        boolean sdCardExist = Environment.getExternalStorageState()                   .equals(android.os.Environment.MEDIA_MOUNTED);  //判斷sd卡是否存在        if(sdCardExist)         {                        sdDir = Environment.getExternalStorageDirectory();//擷取根目錄       }         if(sdDir == null){ //Toast.makeText(context, "No SDCard inside!",Toast.LENGTH_SHORT).show();         return null;       }       return sdDir.toString();           }       private String getRootDir(){     String root = "/";          path = getSDPath();     if (path == null)       path="/";          return root;   }      private String getSubDir(String path){     String subpath = null;          int pos = path.lastIndexOf("/");          if(pos == path.length()){       path = path.substring(0,path.length()-1);       pos = path.lastIndexOf("/");     }          subpath = path.substring(0,pos);          if(pos == 0)       subpath = path;          return subpath;   } } 
package hkp.dirchooser;import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;  public class MainActivity extends Activity {   /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     Button btn = (Button) findViewById(R.id.btn_open);     btn.setOnClickListener(new OnClickListener() {              @Override       public void onClick(View v) {         // TODO Auto-generated method stub         String path = null;         String [] fileType = {"dst"};//要過濾的檔案類型列表         DirChooserDialog dlg = new DirChooserDialog(MainActivity.this,2,fileType,path);         dlg.setTitle("Choose dst file dir");         dlg.show();                }     });   } } 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.