Android自定义文件路径选择器

作者:mmsx 时间:2022-11-09 03:04:07 

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

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

来源:https://blog.csdn.net/qq_16064871/article/details/81838720

标签:Android,路径,选择器
0
投稿

猜你喜欢

  • Unity 制作一个分数统计系统

    2021-11-30 03:01:52
  • Android实现App中导航Tab栏悬浮的功能

    2021-11-22 23:11:31
  • SpringBoot整合WebSocket的客户端和服务端的实现代码

    2023-03-30 04:19:07
  • C#8 的模式匹配实现

    2023-02-11 16:22:16
  • 简述Java编程之关系操作符

    2021-08-07 09:44:23
  • 使用java生成字母验证码

    2021-10-29 23:50:25
  • Kotlin与java8的SAM转换对比(进阶)

    2023-05-15 11:50:35
  • mybatis foreach 循环 list(map)实例

    2023-11-23 23:39:05
  • java获取系统路径字体、得到某个目录下的所有文件名、获取当前路径

    2023-11-29 14:39:23
  • C# 网络编程之UDP

    2021-10-02 16:06:40
  • Java Springboot 重要知识点整理汇总

    2022-03-17 01:06:57
  • 一文理解Android系统中强指针的实现

    2022-03-11 11:37:02
  • Java数组高级算法与Arrays类常见操作小结【排序、查找】

    2022-12-02 15:17:14
  • RecyclerView上拉加载封装代码

    2023-05-08 21:02:05
  • 关于MyBatis plus条件构造器的逐条详解

    2021-10-06 07:31:51
  • Android如何获取APP启动时间

    2021-11-13 06:13:47
  • Java笛卡尔积算法原理与实现方法详解

    2023-11-18 22:08:17
  • C#实现的三种模拟自动登录和提交POST信息的方法

    2022-05-28 01:49:32
  • slf4j jcl jul log4j1 log4j2 logback各组件系统日志切换

    2023-08-08 13:00:41
  • 详解Android性能优化之启动优化

    2023-07-16 06:00:07
  • asp之家 软件编程 m.aspxhome.com