// filename: CallbackBundle.java  package com.example.openfiledemo;    import android.os.Bundle;  // 简单的Bundle参数回调接口  public interface CallbackBundle {      abstract void callback(Bundle bundle);  } 

然后对打开文件对话框的封装:

// filename: OpenFileDialog.javapackage com.example.openfiledemo;import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class OpenFileDialog {public static String tag = "OpenFileDialog";static final public String sRoot = "/"; static final public String sParent = "..";static final public String sFolder = ".";static final public String sEmpty = "";static final private String sOnErrorMsg = "No rights to access!";// 参数说明// context:上下文// dialogid:对话框ID// title:对话框标题// callback:一个传递Bundle参数的回调接口// suffix:需要选择的文件后缀,比如需要选择wav、mp3文件的时候设置为".wav;.mp3;",注意最后需要一个分号(;)// images:用来根据后缀显示的图标资源ID。//根目录图标的索引为sRoot;//父目录的索引为sParent;//文件夹的索引为sFolder;//默认图标的索引为sEmpty;//其他的直接根据后缀进行索引,比如.wav文件图标的索引为"wav"public static Dialog createDialog(int id, Context context, String title, CallbackBundle callback, String suffix, Map<String, Integer> images){AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setView(new FileSelectView(context, id, callback, suffix, images));Dialog dialog = builder.create();//dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);dialog.setTitle(title);return dialog;}static class FileSelectView extends ListView implements OnItemClickListener{private CallbackBundle callback = null;private String path = sRoot;private List<Map<String, Object>> list = null;private int dialogid = 0;private String suffix = null;private Map<String, Integer> imagemap = null;public FileSelectView(Context context, int dialogid, CallbackBundle callback, String suffix, Map<String, Integer> images) {super(context);this.imagemap = images;this.suffix = suffix==null?"":suffix.toLowerCase();this.callback = callback;this.dialogid = dialogid;this.setOnItemClickListener(this);refreshFileList();}private String getSuffix(String filename){int dix = filename.lastIndexOf('.');if(dix<0){return "";}else{return filename.substring(dix+1);}}private int getImageId(String s){if(imagemap == null){return 0;}else if(imagemap.containsKey(s)){return imagemap.get(s);}else if(imagemap.containsKey(sEmpty)){return imagemap.get(sEmpty);}else {return 0;}}private int refreshFileList(){// 刷新文件列表File[] files = null;try{files = new File(path).listFiles();}catch(Exception e){files = null;}if(files==null){// 访问出错Toast.makeText(getContext(), sOnErrorMsg,Toast.LENGTH_SHORT).show();return -1;}if(list != null){list.clear();}else{list = new ArrayList<Map<String, Object>>(files.length);}// 用来先保存文件夹和文件夹的两个列表ArrayList<Map<String, Object>> lfolders = new ArrayList<Map<String, Object>>();ArrayList<Map<String, Object>> lfiles = new ArrayList<Map<String, Object>>();if(!this.path.equals(sRoot)){// 添加根目录 和 上一层目录Map<String, Object> map = new HashMap<String, Object>();map.put("name", sRoot);map.put("path", sRoot);map.put("img", getImageId(sRoot));list.add(map);map = new HashMap<String, Object>();map.put("name", sParent);map.put("path", path);map.put("img", getImageId(sParent));list.add(map);}for(File file: files){if(file.isDirectory() && file.listFiles()!=null){// 添加文件夹Map<String, Object> map = new HashMap<String, Object>();map.put("name", file.getName());map.put("path", file.getPath());map.put("img", getImageId(sFolder));lfolders.add(map);}else if(file.isFile()){// 添加文件String sf = getSuffix(file.getName()).toLowerCase();if(suffix == null || suffix.length()==0 || (sf.length()>0 && suffix.indexOf("."+sf+";")>=0)){Map<String, Object> map = new HashMap<String, Object>();map.put("name", file.getName());map.put("path", file.getPath());map.put("img", getImageId(sf));lfiles.add(map);}}  }list.addAll(lfolders); // 先添加文件夹,确保文件夹显示在上面list.addAll(lfiles);//再添加文件SimpleAdapter adapter = new SimpleAdapter(getContext(), list, R.layout.filedialogitem, new String[]{"img", "name", "path"}, new int[]{R.id.filedialogitem_img, R.id.filedialogitem_name, R.id.filedialogitem_path});this.setAdapter(adapter);return files.length;}@Overridepublic void onItemClick(AdapterView<?> parent, View v, int position, long id) {// 条目选择String pt = (String) list.get(position).get("path");String fn = (String) list.get(position).get("name");if(fn.equals(sRoot) || fn.equals(sParent)){// 如果是更目录或者上一层File fl = new File(pt);String ppt = fl.getParent();if(ppt != null){// 返回上一层path = ppt;}else{// 返回更目录path = sRoot;}}else{File fl = new File(pt);if(fl.isFile()){// 如果是文件((Activity)getContext()).dismissDialog(this.dialogid); // 让文件夹对话框消失// 设置回调的返回值Bundle bundle = new Bundle();bundle.putString("path", pt);bundle.putString("name", fn);// 调用事先设置的回调函数this.callback.callback(bundle);return;}else if(fl.isDirectory()){// 如果是文件夹// 那么进入选中的文件夹path = pt;}}this.refreshFileList();}}}

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:id="@+id/vw1"      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:background="#000000"      android:orientation="horizontal"      android:padding="4dp" >   <ImageView          android:id="@+id/filedialogitem_img"          android:layout_width="32dp"          android:layout_height="32dp"          android:layout_margin="4dp"/>     <LinearLayout         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:orientation="vertical" >          <TextView              android:id="@+id/filedialogitem_name"              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:textColor="#FFFFFF"              android:textSize="18sp"              android:textStyle="bold" />          <TextView              android:id="@+id/filedialogitem_path"              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:paddingLeft="10dp"              android:textColor="#FFFFFF"              android:textSize="14sp" />      </LinearLayout>  </LinearLayout>  


 下面是使用的例子:  

// filename: OpenFileDemo.java  package com.example.openfiledemo;    import java.util.HashMap;  import java.util.Map;    import android.os.Bundle;  import android.app.Activity;  import android.app.Dialog;  import android.view.View;  import android.view.View.OnClickListener;    public class OpenFileDemo extends Activity {            static private int openfileDialogId = 0;            @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_open_file_demo);                              // 设置单击按钮时打开文件对话框          findViewById(R.id.button_openfile).setOnClickListener(new OnClickListener() {              @Override              public void onClick(View arg0) {                  showDialog(openfileDialogId);              }          });      }        @Override      protected Dialog onCreateDialog(int id) {          if(id==openfileDialogId){              Map<String, Integer> images = new HashMap<String, Integer>();              // 下面几句设置各文件类型的图标, 需要你先把图标添加到资源文件夹              images.put(OpenFileDialog.sRoot, R.drawable.filedialog_root);   // 根目录图标              images.put(OpenFileDialog.sParent, R.drawable.filedialog_folder_up);    //返回上一层的图标              images.put(OpenFileDialog.sFolder, R.drawable.filedialog_folder);   //文件夹图标              images.put("wav", R.drawable.filedialog_wavfile);   //wav文件图标              images.put(OpenFileDialog.sEmpty, R.drawable.filedialog_root);              Dialog dialog = OpenFileDialog.createDialog(id, this, "打开文件", new CallbackBundle() {                  @Override                  public void callback(Bundle bundle) {                      String filepath = bundle.getString("path");                      setTitle(filepath); // 把文件路径显示在标题上                  }              },               ".wav;",              images);              return dialog;          }          return null;      }  }  


工程可在我的百度网盘下载,开源Android


放两张效果图:

Android 实现 选择文件对话框_第1张图片

转自: http://blog.csdn.net/trbbadboy/article/details/7899424



更多相关文章

  1. Android attrs文件(自定义)属性详解
  2. Android 使用AsyncHttpClient文件上传与下载
  3. AndroidManifest文件中android属性
  4. Android 的相关文件类型
  5. Android中attrs.xml文件的使用详解
  6. 如何给你的Android 安装文件(APK)瘦身
  7. 教你用电脑从 Google Play 下载 Android 程序 apk 文件
  8. Android获取keystore文件的信息
  9. Android学习笔记_布局文件属性的说明

随机推荐

  1. Android布局案例之人人android九宫格
  2. Android进程管理机制及优化(HTC&其它可参
  3. Android开机速度 ------之ART预优化dex2o
  4. Android高手进阶教程(二十五)之---Androi
  5. Android(安卓)4.0 触摸屏消息(二大写的二)
  6. Android中的线程处理
  7. Android(安卓)资源,国际化,自适应
  8. Android九宫格图片(9.png)的讲解与制作
  9. 想抢先体验Android操作系统的魅力吗?那就
  10. 如何检索Android设备的唯一ID