Android自定义文件路径选择器

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

1、效果图

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进行封装即可。

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

(0)

相关推荐

  • Android 文件选择器详解及实例代码

    本文给大家讲解下Android文件选择器的使用.实际上就是获取用户在SD卡中选择的文件或文件夹的路径,这很像C#中的OpenFileDialog控件. 此实例的实现过程很简单,这样可以让大家快速的熟悉Android文件选择器,提高开发效率. 网上曾经见到过一个关于文件选择器的实例,很多人都看过,本实例是根据它修改而成的,但更容易理解,效率也更高,另外,本实例有自己的特点:   1.监听了用户按下Back键的事件,使其返回上一层目录.        2.针对不同的文件类型(文件vs文件夹 , 目标

  • Android文件选择器ExFilePicker的使用方法

    在新版的android中(如Android 7.0+),文件选择由于权限限制,Uri变化,文件资源路径格式改版等等,变得比较复杂起来,比如,得在Androidmanifest配置FileProvider完了还得写xml目录下的文件path这些等等.一些第三方的文件选择器,就算没有上面这些动作,一般也得在Androidmanifest写几个Activity.而ExFilePicker则无需上面的繁琐操作,一不需要在Androidmanifest里面定义FileProvider,二不需要写xml文件

  • Android第三方文件选择器aFileChooser使用方法详解

    aFileChooser是android平台上的一个第三方文件选择器,其在github上的项目主页是:https://github.com/iPaulPro/aFileChooser aFileChooser实现了在Android平台上高度可定制化的文件选择功能,aFileChooser在自己的项目代码中使用也比较简单. 写一个简单例子加以说明. (1) 首先要配置Androidmanifest.xml文件: <activity android:name="com.ipaulpro.afi

  • Android自定义文件路径选择器

    文中涉及到文件名称排序,固定根目录以及返回上一层在上面,方便选择等.根据文件后缀,筛选文件还没做.先看效果. 1.效果图 2.核心代码如下 是通过继承BaseAdapter 完成的,里面有自定义layout界面.进行管理返回跟目录以及上一层,方便管理. package com.filebrowser; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFact

  • android自定义滚轴选择器

    本文实例为大家分享了android自定义滚轴选择器的具体代码,供大家参考,具体内容如下 效果图: 点击选择餐具弹出底部弹窗 private Dialog dialog; private View inflate; PickValueView pickString; case R.id.rl_cj_num://餐具数量选择 //选择对话框 dialog = new Dialog(this, R.style.ActionSheetDialogStyle); View contentView = La

  • Android自定义酒店日期选择器

    Android自定义日期区间选择器,类似于途家等酒店.旅游日期区间选择器: 重写PopupWindow 制定区间日历 添加日历日期选中监听 封装插件化 github开源 CustomDatePicker 类似于途家等酒店日期选择器,弹出自定义的PopupWindow,监听日期选中,返回结果.代码已经开源到GitHub上,提供插件化. -- [ Wiki ] Github 地址:CustomHotelCalender 1. 添加依赖: Step 1.Add it in your root buil

  • Android 保存文件路径方法

    Android保存文件到本地路径问题 常见路径 例如: application 包名: com.my.company 项目名: chat /data/data == ///data/user/0 getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录, 一般放一些长时间保存的数据 getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录, 一般存放

  • Android自定义View仿IOS圆盘时间选择器

    通过自定义view实现仿iOS实现滑动两端的点选择时间的效果 效果图 自定义的view代码 public class Ring_Slide2 extends View { private static final double RADIAN = 180 / Math.PI; private int max_progress; // 设置最大进度 private int cur_progress; //设置锚点1当前进度 private int cur_progress2; //设置锚点2进度 p

  • Android Uri和文件路径互相转换的实例代码

    在项目中需要用到将Uri转换为绝对路径,在网上找到一个方法,做个笔记 网上有不少方法,但是有的对4.4后的版本无效,这里的方法可以在4.4之后的版本将Uri转换为绝对路径 public class GetPathFromUri { /** * 专为Android4.4设计的从Uri获取文件绝对路径 */ public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Bui

  • android图片文件的路径地址与Uri的相互转换方法

    一个android文件的Uri地址一般如下: content://media/external/images/media/62026 这是一张图片的Uri,那么我们如何根据这个Uri获得其在文件系统中的路径呢? 其实很简单,直接上代码: public static String getRealFilePath( final Context context, final Uri uri ) { if ( null == uri ) return null; final String scheme

  • Android自定义滚动选择器实例代码

    Android自定义滚动选择器 实现图片的效果 代码如下 package com.linzihui.widget; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Align; import android.graph

  • Android自定义DataTimePicker实例代码(日期选择器)

    笔者有一段时间没有发表关于Android的文章了,关于Android自定义组件笔者有好几篇想跟大家分享的,后期会记录在博客中.本篇博客给大家分享的是自定义一个日期选择器,可以让用户同时选择年月日和当前时间. 先看看效果: 实现的效果就是在同一个布局上显示日期选择和时间选择. 自定义一个类: /DateTimePicker/src/com/wwj/datetimepicker/DateTimePickDialogUtil.java package com.wwj.datetimepicker; i

随机推荐