Android 自定义文件路径选择器

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

1、效果图

Android 自定义文件路径选择器_第1张图片

 

Android 自定义文件路径选择器_第2张图片

 

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 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() {
            @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());
        }
    }
}

使用的布局如下:




    

        

        

            

                

                

                

                

            

            

                

                

                

                

            

        


        

        

    


调用方式

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;

        }
    }

}



    
    

        


            

返回选择的目录

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、最后肯定是权限

    
    

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

你可能感兴趣的:(Android,移动开发,Android,常用开发技术)