栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android应用中实现选择本地文件与目录的实例分享

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android应用中实现选择本地文件与目录的实例分享

文件选择器
今天给大家分享下文件选择器的作用 , 具体就是获取用户在在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 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() ; 
    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

 
 
 
   
  
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 Adapter; 
  ArrayList arr=new ArrayList(); 
   
  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; 
   
   
  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; 
  } 
   
  @Override 
  public void dismiss() { 
    // TODO Auto-generated method stub 
    super.dismiss(); 
  } 
   
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.chooserdialog); 
     
    path = getRootDir(); 
    arr = (ArrayList) getDirs(path); 
    Adapter = new ArrayAdapter(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 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 getDirs(String ipath){ 
    List file = new ArrayList(); 
//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; 
  } 
   
  @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 { 
   
  @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(); 
  
      } 
    }); 
  } 
} 


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/163073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号