首页 > 系统 > Android > 正文

Android自定义文件路径选择器

2019-10-21 21:40:49
字体:
来源:转载
供稿:网友

文中涉及到文件名称排序,固定根目录以及返回上一层在上面,方便选择等。根据文件后缀,筛选文件还没做。先看效果。

1、效果图

Android,文件路径,选择器

Android,文件路径,选择器

2、核心代码如下

是通过继承BaseAdapter 完成的,里面有自定义layout界面。进行管理返回跟目录以及上一层,方便管理。

package com.filebrowser; import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView; import java.io.File;import java.io.FileFilter;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.List; public class MyAdapter extends BaseAdapter implements View.OnClickListener, AdapterView.OnItemClickListener {  private String rootPath;  private LayoutInflater mInflater;  private Bitmap mIcon3;  private Bitmap mIcon4;  private List<File> fileList;  private View header;  private View layoutReturnRoot;  private View layoutReturnPre;  private TextView curPathTextView;  private String suffix = "";  private String currentDirPath;  private FileSelectListener listener;   public MyAdapter(View fileSelectListView, String rootPath, String defaultPath) {    this.rootPath = rootPath;    Context context = fileSelectListView.getContext();    mInflater = LayoutInflater.from(context);    mIcon3 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_fodler);    mIcon4 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_file);     curPathTextView = (TextView) fileSelectListView.findViewById(R.id.curPath);    header = fileSelectListView.findViewById(R.id.layoutFileListHeader);    layoutReturnRoot = fileSelectListView.findViewById(R.id.layoutReturnRoot);    layoutReturnPre = fileSelectListView.findViewById(R.id.layoutReturnPre);    layoutReturnRoot.setOnClickListener(this);    layoutReturnPre.setOnClickListener(this);    if (defaultPath != null && !defaultPath.isEmpty()) {      getFileDir(defaultPath);    } else {      getFileDir(rootPath);    }    ListView listView = (ListView) fileSelectListView.findViewById(R.id.list);    listView.setAdapter(this);    listView.setOnItemClickListener(this);  }   private class ViewHolder {    TextView text;    ImageView icon;  }   public interface FileSelectListener {    void onFileSelect(File selectedFile);     void onDirSelect(File selectedDir);  }   public void setOnFileSelectListener(FileSelectListener listener) {    this.listener = listener;  }   /**   * 获取所选文件路径下的所有文件,并且更新到listview中   */  private void getFileDir(String filePath) {    File file = new File(filePath);    File[] files = file.listFiles(new FileFilter() {      @Override      public boolean accept(File pathname) {        if (pathname.isFile()&&!suffix.isEmpty()){          return pathname.getName().endsWith(suffix);        }        return true;      }    });    fileList = Arrays.asList(files);    //按名称排序    Collections.sort(fileList, new Comparator<File>() {      @Override      public int compare(File o1, File o2) {        if (o1.isFile() && o2.isDirectory())          return 1;        if (o1.isDirectory() && o2.isFile())          return -1;        return o1.getName().compareTo(o2.getName());      }    });     if (header != null) {      header.setVisibility(filePath.equals(rootPath) ? View.GONE : View.VISIBLE);    }     notifyDataSetChanged();     if (curPathTextView != null) {      curPathTextView.setText(filePath);    }    currentDirPath = filePath;     if (listener!=null){      listener.onDirSelect(file);    }  }    public int getCount() {    return fileList.size();  }   public Object getItem(int position) {    return fileList.get(position);  }   public long getItemId(int position) {    return position;  }   public View getView(int position, View convertView, ViewGroup parent) {    ViewHolder holder;    if (convertView == null) {      convertView = mInflater.inflate(R.layout.file_item, null);      holder = new ViewHolder();      holder.text = (TextView) convertView.findViewById(R.id.text);      holder.icon = (ImageView) convertView.findViewById(R.id.icon);      convertView.setTag(holder);    } else {      holder = (ViewHolder) convertView.getTag();    }     File file = fileList.get(position);    holder.text.setText(file.getName());    if (file.isDirectory()) {      holder.icon.setImageBitmap(mIcon3);    } else {      holder.icon.setImageBitmap(mIcon4);    }    return convertView;  }   @Override  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {    File file = fileList.get(position);    if (file.isDirectory()) {      getFileDir(file.getPath());    } else {      if (listener!=null){        listener.onFileSelect(file);      }    }  }   @Override  public void onClick(View v) {    if (v.getId() == R.id.layoutReturnRoot) {      getFileDir(rootPath);    } else if (v.getId() == R.id.layoutReturnPre) {      getFileDir(new File(currentDirPath).getParent());    }  }}

使用的布局如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:background="@color/white"  android:layout_height="wrap_content">   <LinearLayout    android:id="@+id/layoutFileSelectList"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:layout_marginTop="10dp"    android:orientation="vertical"    android:showDividers="middle|end">     <TextView      android:id="@+id/curPath"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_marginBottom="6dp"      android:paddingLeft="10dp"      android:textSize="16sp" />     <LinearLayout      android:id="@+id/layoutFileListHeader"      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:divider="@drawable/shape_divider_line"      android:showDividers="beginning|middle|end"      android:orientation="vertical">       <LinearLayout        android:id="@+id/layoutReturnRoot"        android:layout_width="match_parent"        android:layout_height="50dp"        android:paddingLeft="10dp"        android:gravity="center"        android:orientation="horizontal">         <ImageView          android:id="@+id/iv_return_root"          android:layout_width="30dp"          android:layout_height="30dp"          android:background="@drawable/icon_back">         </ImageView>         <TextView          android:id="@+id/tv_return_root"          android:layout_width="0dp"          android:layout_height="match_parent"          android:layout_weight="1"          android:gravity="center_vertical"          android:paddingLeft="10dp"          android:text="@string/ReturnRootDir"          android:textSize="16sp">         </TextView>       </LinearLayout>       <LinearLayout        android:id="@+id/layoutReturnPre"        android:layout_width="match_parent"        android:layout_height="50dp"        android:paddingLeft="10dp"        android:gravity="center"        android:orientation="horizontal">         <ImageView          android:id="@+id/iv_return_pre"          android:layout_width="30dp"          android:layout_height="30dp"          android:background="@drawable/icon_back02">         </ImageView>         <TextView          android:id="@+id/tv_return_pre"          android:layout_width="0dp"          android:layout_height="match_parent"          android:layout_weight="1"          android:gravity="center_vertical"          android:paddingLeft="10dp"          android:text="@string/ReturnPreDir"          android:textSize="16sp">         </TextView>       </LinearLayout>     </LinearLayout>      <ListView      android:id="@+id/list"      android:layout_width="match_parent"      android:layout_height="match_parent">     </ListView>   </LinearLayout> </LinearLayout>

调用方式

package com.filebrowser; import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.TextView;import java.io.File; public class FileBrowserActivity extends Activity implements    View.OnClickListener, MyAdapter.FileSelectListener {  private TextView curPathTextView;  private String rootPath = "";  private MyAdapter listAdapter;  //初始化进入的目录,默认目录  private String filePath = "";   protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_file_browser_acitivity);    initView();     //跟目录    rootPath = getIntent().getStringExtra("rootPath");    //指定文件夹    filePath = getIntent().getStringExtra("path");     curPathTextView.setText(filePath);    filePath = filePath.isEmpty() ? rootPath : filePath;    View layoutFileSelectList = findViewById(R.id.layoutFileSelectList);    listAdapter = new MyAdapter(layoutFileSelectList, rootPath, filePath);    listAdapter.setOnFileSelectListener(this);     findViewById(R.id.btnSure).setOnClickListener(this);    findViewById(R.id.btnCancel).setOnClickListener(this);  }   @Override  public void finish() {    Intent intent = new Intent();    intent.putExtra("file", filePath);    setResult(RESULT_OK, intent);    super.finish();  }   private void initView() {    curPathTextView = (TextView) findViewById(R.id.curPath);  }    @Override  public void onFileSelect(File selectedFile) {    filePath = selectedFile.getPath();  }   @Override  public void onDirSelect(File selectedDir) {    filePath = selectedDir.getPath();  }   @Override  public void onClick(View v) {    switch (v.getId()){      case R.id.btnSure:        finish();        break;      case R.id.btnCancel:        filePath ="";        finish();        break;       default:        break;     }  } }
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:id="@+id/layoutProgramManagerMainView"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:focusable="true"  android:focusableInTouchMode="true"  android:orientation="vertical">   <include    android:layout_weight="1"    android:layout_width="match_parent"    android:layout_height="0dp"    layout="@layout/layout_file_select_list"/>  <LinearLayout    android:layout_width="match_parent"    android:layout_height="50dp"    android:layout_gravity="bottom"    android:layout_weight="0"    android:orientation="vertical"    android:showDividers="beginning">     <LinearLayout      android:layout_width="match_parent"      android:layout_height="match_parent"      android:gravity="center"      android:orientation="horizontal">        <Button        android:id="@+id/btnCancel"        android:layout_width="0dp"        android:layout_height="40dp"        android:layout_weight="1"        android:text="@string/cancel"        android:textSize="16sp" />      <Button        android:id="@+id/btnSure"        android:layout_width="0dp"        android:layout_height="40dp"        android:layout_weight="1"        android:text="@string/sure"        android:textSize="16sp" />     </LinearLayout>  </LinearLayout> </LinearLayout>

返回选择的目录

package com.filebrowser; import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Environment;import android.os.storage.StorageManager;import android.view.View;import android.widget.Button;import android.widget.TextView;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Locale; public class MainActivity extends Activity {  public static final int FILE_RESULT_CODE = 1;  private Button btn_open;  private TextView changePath;  private String rootPath;   @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    initListener();  }   private void initView() {    btn_open = (Button) findViewById(R.id.btn_open);    changePath = (TextView) findViewById(R.id.changePath);  }   private void initListener() {    btn_open.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {        openBrowser();      }    });     findViewById(R.id.btn_open1).setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        openBrowser1();      }    });  }   private void openBrowser() {    rootPath = System.getenv("SECONDARY_STORAGE");    if (rootPath == null) {      rootPath = Environment.getExternalStorageDirectory().toString();    }    if ((rootPath.equals(Environment.getExternalStorageDirectory().toString()))) {      String filePath = rootPath + "/Android";      Intent intent = new Intent(MainActivity.this, FileBrowserActivity.class);      //根目录      intent.putExtra("rootPath", rootPath);      //进去指定文件夹      intent.putExtra("path", filePath);      startActivityForResult(intent, FILE_RESULT_CODE);    }  }   private void openBrowser1() {    rootPath = getSdcardPath();    if (rootPath == null || rootPath.isEmpty()) {      rootPath = Environment.getExternalStorageDirectory().toString();    }    Intent intent = new Intent(MainActivity.this, FileBrowserActivity.class);    intent.putExtra("rootPath", rootPath);    intent.putExtra("path", rootPath);    startActivityForResult(intent, FILE_RESULT_CODE);  }   public String getSdcardPath() {    String sdcardPath = "";    String[] pathArr = null;    StorageManager storageManager = (StorageManager) getSystemService(STORAGE_SERVICE);    try {      Method getVolumePaths = storageManager.getClass().getMethod("getVolumePaths");      pathArr = (String[]) getVolumePaths.invoke(storageManager);    } catch (NoSuchMethodException e) {      e.printStackTrace();    } catch (InvocationTargetException e) {      e.printStackTrace();    } catch (IllegalAccessException e) {      e.printStackTrace();    }    if (pathArr != null && pathArr.length >= 3) {      sdcardPath = pathArr[1];    }    return sdcardPath;  }   @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {    if (FILE_RESULT_CODE == requestCode) {      Bundle bundle = null;      if (data != null && (bundle = data.getExtras()) != null) {        String path = bundle.getString("file","");        if(!path.isEmpty()){          changePath.setText("选择路径为 : " + path);        }      }    }  }}

3、最后肯定是权限

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

其实后面可以封装成一个自定义的view 进行继承LinearLayout进行封装即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表