美文网首页自定义控件Android自定义控件Android
LFilePicker---文件选择利器,各种样式有它就够了

LFilePicker---文件选择利器,各种样式有它就够了

作者: 木木仨儿 | 来源:发表于2017-04-07 08:48 被阅读3922次
    LFilePicker

    版本已更新至1.6.0,最新功能请查看传送门:
    https://github.com/leonHua/LFilePicker

    在 Android 开发中如果需要选择某个文件,可以直接调取系统的文件管理器进行选择,但是无法保证各个厂商的手机界面一致,而且解析Uri 还比较繁琐,如果还需要多选呢?需要文件类型过滤呢?老板说界面丑呢?

    那么福利来了,你可以使用LFilePicker,它都支持什么呢?

    • 还算漂亮的界面
    • 各种手机一致的体验
    • 多种界面风格
    • 自定义标题文字和颜色
    • 文件多选或者单选
    • 文件类型过滤
    • Fragment启动
    • 国际化(中英文切换)
    • 文件数量限制
      在哪里能找到它呢?Bio Bio Bio

    心急的人可以直接根据说明文档进行使用了,任性的人跟着我继续走~~~
    先看看界面,万一丑的不行呢?

    默认界面默认界面

    好了还算可以把,和经典的Windows风格类似,先用用看吧。怎么用呢?

    基础用法

    1.添加依赖

    compile 'com.leon:lfilepickerlibrary:1.3.0'
    

    【P.S.】 话说为了能够方便的依赖使用可是操碎了心,将项目库开源到JCenter使用的过程中趟了很多坑,如果感兴趣,可以查看文章:新版Bintray下将Android Library 开源到JCenter 的正确姿势

    另外,如果网络环境有问题无法正常使用compile指令(像我这样),良心提供 aar 文件下载使用。
    下载链接:lfilepickerlibrary
    【P.S.】 如果不知道 aar 如何使用,请参考文章:Android中 aar 文件的日常使用

    2.添加文件读写权限

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

    3.打开选择界面

    你可以在Activity中打开:

    new LFilePicker()
                .withActivity(MainActivity.this)
                .withRequestCode(Consant.REQUESTCODE_FROM_ACTIVITY)
                .start();
    

    也可以在Fragment中打开(同时支持v4包SupportFragment):

    new LFilePicker().withSupportFragment(mFragment)
                            .withRequestCode(Consant.REQUESTCODE_FROM_FRAGMENT)
                            .withTitle("Open From Fragment")
                            .start();
    

    4.接收选择返回值

    重写方法并获取数据:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            if (requestCode == Consant.REQUESTCODE_FROM_ACTIVITY) {
                List<String> list = data.getStringArrayListExtra(Constant.RESULT_INFO);
                Toast.makeText(getApplicationContext(), "选中了" + list.size() + "个文件", Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    已经以上你已经能够正常使用了,但是说好的那么多特性呢?接下来,深入一点

    自由使用

    文件夹和文件图标太low?换!

    new LFilePicker()
                    .withActivity(this)
                    .withRequestCode(Consant.REQUESTCODE_FROM_ACTIVITY)
                    .withIconStyle(Constant.ICON_STYLE_YELLOW)
                    .start();
    

    withIconStyle(mIconType)提供三种风格:

    • Constant.ICON_STYLE_YELLOW 经典黄(默认风格)
    • Constant.ICON_STYLE_GREEN 清新绿
    • Constant.ICON_STYLE_BLUE 柔和蓝
    清新绿风格清新绿风格 柔和蓝风格柔和蓝风格

    选择界面标题不合适?换!

      new LFilePicker()
                    .withActivity(this)
                    .withRequestCode(Consant.REQUESTCODE_FROM_ACTIVITY)
                    .withTitle("我的标题")//标题文字
                    .withTitleColor("#FF99CC")//文字颜色
                    .start();
    
    标题和文字颜色效果标题和文字颜色效果

    想要限制单选或者多选?换!

     new LFilePicker()
                    .withActivity(this)
                    .withRequestCode(Consant.REQUESTCODE_FROM_ACTIVITY)
                    .withMutilyMode(true)
                    .start();
    

    withMutilyMode(true):true代表多选;false代表单选

    多选效果多选效果 单选效果单选效果

    想要限制选择文件类型?过滤!

     new LFilePicker()
                    .withActivity(this)
                    .withRequestCode(Consant.REQUESTCODE_FROM_ACTIVITY)
                    .withFileFilter(new String[]{".txt", ".png"})
                    .start();
    
    默认不过滤效果默认不过滤效果
    过滤后效果过滤后效果

    英文怎么搞?已经内置实现!

    将手机语言调整为英文后:


    英语环境操作英语环境操作

    返回图标不喜欢?换!

    new LFilePicker()
                    .withActivity(this)
                    .withRequestCode(Consant.REQUESTCODE_FROM_ACTIVITY)
                    .withBackIcon(Constant.BACKICON_STYLEONE)
                    .start();
    

    withBackIcon() 提供三种风格:

    • Constant.BACKICON_STYLEONE
    • Constant.BACKICON_STYLETWO
    • Constant.BACKICON_STYLETHREE
    风格1风格1 风格2风格2 风格3风格3

    标题背景颜色不喜欢?换!

      new LFilePicker()
                    .withActivity(this)
                    .withRequestCode(Consant.REQUESTCODE_FROM_ACTIVITY)
                    .withBackgroundColor("#FF9966")
                    .start();
    
     背景颜色效果图 背景颜色效果图

    切换选择路径?已经包含,随便选!

    路径选择效果路径选择效果

    结束

    基本上能够满足日常选择文件的需求了,开源不易,如果对你有用,欢迎Star给我一个小小的鼓励!

    更多文章欢迎访问:我的博客

    相关文章

      网友评论

      • 至尊宝_c429:您好,这个怎么在onActivityResult中获取文件的全路径呢,现在只能拿到文件夹路径。。。
      • Lion_b603:您好,我下载这个aar文件 运行 报错,请问怎么解决
        木木仨儿:aar不是最新的版本,后面的版本没有提供aar文件了
      • Sona的杂货铺:我们在设置文件最大选择数量后 超过这个数虽然有文字提示但仍然可以选中 建议超过这个数目后 不可选中
        木木仨儿:嗯,这是个待优化的地方~~~
      • 深港澳第一程序员:兄弟吐司怎么改啊。我还要改源码吗?太麻烦
      • 我从利比亚来:你好。我下载的aar文件引用后发现里面少了个withStartPath()方法,可以发一个新的aar文件吗
        木木仨儿:看github最新说明,我记得后面的版本没有提供aar文件,都是依赖形式添加的
      • 瓦雷:请问可以按类型检索吗?比如说列出所有的.pdf、.docx等
        瓦雷:@木木仨儿 请问如何同步多媒体库呢?同步整个文件夹,不是具体文件
        瓦雷:@木木仨儿 使用的是遍历sd卡还是多媒体库MediaStore呢
        木木仨儿:@秋睦 可以,看下这个方法:withFileFilter(String[] arrs) 设置文件类型过滤器,这里面可以传入过滤的类型
      • JackJiang2011:赞一个!
        木木仨儿:@JackJiang2011 谢谢~~~
      • 我从利比亚来:请问withStartPath()这个方法找不到怎么解决
        我从利比亚来:@木木仨儿 好的,我试试,谢谢啦
        木木仨儿:@我从利比亚来 依赖的最新的版本吗?如果是最新的版本还不行可能就是打包有问题,建议你先依赖工程试试可以访问不,工程代码应该是新的
      • littlewoodman:用了一下,确实不错
      • 7d356af0034c:打算集成到自己项目里体验一把,结果,发觉把我的APP名字冲掉了,换成了LFilePickerLibrary。怎么个避免呢?
        张小强_f1cd:@木木仨儿 只改变了标题栏的颜色,而状态栏还是默认的颜色啊?
        木木仨儿:@johnyyc github里有人提到过这个问题,查看一下关闭的issure
      • 7edee1bb7be3:我的项目complie引用后,应用的名称就变成LFilePickerSample了,,,,
        木木仨儿:@10597 OKOK:smile:
        7edee1bb7be3:@木木仨儿 弄好了,是因为引用了中文下的app_name,我创建一个就行
        木木仨儿: 在你的application里android:label="@string/app_name"这里改一下,app_name定义个新名字,貌似是和库里的名字重复了,默认的都是这个
      • airxiao:部分机型点击 openFromActivity 会闪退,比如米 2s
        airxiao:@木木仨儿 FileUtils 类的 17 行
        木木仨儿:@年轻人要up 恩恩,我这边木有这个测试机,能看下报错的具体信息吗
      • Steve_man:你好,状态栏能沉浸式吗
        木木仨儿:withBackgroundColor,这个背景色设置和状态栏颜色一致就可以了
      • feer921:确实不易!该项目还要考虑的有:1.只选择文件夹
        2:一个文件夹被选中后,该文件夹下面的都应该被选中
        3:全选与取消全选
        木木仨儿:@feer921 谢谢,有时间会继续进行完善的~~~
        feer921: @feer921 4:上次选择的文件或者文件夹,再进去后要保持选中
      • 17bb65b019f9:你好 请问一下,我在一级列表选中文件后,我去到下一级,然后返回来,文件勾选状态没了,我看你全部都替换了数据源然后notify,能不能保存勾选状态啊?
        木木仨儿:获取文件地址,为了避免递归速度太慢,所以是选择每个目录后只拿到当前目录下一级的所有目录。目前不能保存多级目录选中的状态。。。
        木木仨儿:@yyyqh 默认列表重新加载就是显示第一个位置,你可以保存下你之前的位置,让后调取Recyclerview的方法让它滚动到指定位置
        17bb65b019f9:还有返回上一级能不能不让他回到postion(0)的位置,我去掉你这句代码, 返回上一级还是在顶部
      • 0a105caa3c54:我想要获取用户选择的多个文件的路径怎么获取啊?
        0a105caa3c54:@木木仨儿 恩恩,好的,谢谢
        木木仨儿:最后你拿到的就是文件的路径地址,多个文件也都会返回地址的
      • 0a105caa3c54:好像有点问题 啊?constant
        木木仨儿:@差不多先生ly 我测试用的时候没发现崩溃,看下报错信息是什么错误,方便的话发给我哈谢谢
        0a105caa3c54:@木木仨儿 好像按左上角的回退按钮有时候会崩溃
        木木仨儿:看上面的我回复的评论这个问题已经说明了
      • c3f1ada035f0:奈斯,赞一个~~
        木木仨儿:@Lyon丶 引用报错吗?是aar引用?使用方式是?
        c3f1ada035f0:ava.lang.NoSuchFieldError: No static field iv_type of type I in class Lcom/leon/lfilepickerlibrary/R$id; or its superclasses (declaration of 'com.leon.lfilepickerlibrary.R$id' appears in /data/app/com.fips.huashun-1/base.apk:classes2.dex)
      • 艾特不出先生:你这个Consant和Constant类是什么关系?导的包也没有Consant类只有Constant类,且Constant也没有Consant.REQUESTCODE_FROM_FRAGMENT,Constant.RESULT_INFO这些参数的说,你是不是混淆了什么?
        艾特不出先生:@木木仨儿 看了一下你的源码,源码里的是Constant,且没有那个code码值,你这博客的Consant应该改成Constant才有用的说,博主你应该在你源码里更新一下code值,否则只能从你源码里copy过来Constant类自定义一个code值了
        木木仨儿:@艾特不出先生 没有,这些就是变量,startActivityForResult方法的code码值,可以自己定义,这个是我demo例子中的变量,不过demo中也叫Consant重名了,引起歧义了。看下demo调用就明白了
      • 李争献:“全选”功能有吗
        木木仨儿:已经有啦
      • machu:楼主,你好,这个文件选择在7.0的手机上,获取不到本地文件列表?怎么处理呢
        857361cbb7d3:同问呀:fearful:
        木木仨儿:谷歌在7.0上对文件权限做了限制,你可以看看https://developer.android.google.cn/training/articles/scoped-directory-access.html?hl=zh-cn,至于兼容的方式暂时我还没时间去搞,如果你研究过了,欢迎提pull哈
      • null115:良心提供 aar :relaxed:
        木木仨儿:@釋嘫 看一下导包是否正确,确定导入本库下面的Constant类
        釋嘫: 请问下 为什么我的Consant后面没有REQUESTCODE_FROM_ACTIVITY这个属性啊
        木木仨儿:@null115 :ghost: 识货~~
      • 木小青_38ad:赞助半个煎饼果子:yum:
        木木仨儿:@学子要远行 现在选择后返回的是选中文件的路径,根据路径就可以找到文件。。。
        学子要远行:怎么获取选中文件,而不是只是显示文件size大小
        木木仨儿:下次就能买一个啦
      • 8bb18b0decbd:activity_lfile_picker这个布局确实报错,看上去很正常呀,很奇怪
        木木仨儿:@Callous_ 之前一直在5,0的机子上测试,马上改一下这个问题,多谢了大兄弟
        8bb18b0decbd:@木木仨儿 找到为什么了,因为btn_bg只在drawable-21中有,所以21版本以下的会报错,刚试了试7.0的机子没事
        木木仨儿:通过aar文件还是complie引用的?能提供报错信息吗
      • 头发依然在:very good
        木木仨儿:very thanks
      • 工作的道路:依赖aar包发现你包中的constant类中的数据不够啊
        能把constant类完全放入你的aar包中吗
        工作的道路:@木木仨儿 好的 没事 麻烦你啦,好像aar包还有个问题:activity_lfile_picker这个布局里面的代码第43行有问题 因为是aar包我看不了源码,所以不知道哪里出错,Constant.RESULT_INFO这个字符串的话我看了一下源码不知道是不是paths?大神多多教导
        木木仨儿:如果着急使用,可以看看clone代码,把里面的Constant类先拿出来用
        木木仨儿:抱歉,可能是后来更新忘记重新发布aar包了,晚上回去会更新的
      • 微风LE:赞一个
        木木仨儿:谢谢!
      • 74b5aa3074bf:牛逼
        木木仨儿:你的评论也很牛逼:eyes:
      • N丶aMe丨宇宇:标题栏我想用ToolBar怎么办?
        木木仨儿:额,现在标题栏用的就是ToolBar啊
      • 彭小铭:非常棒
        木木仨儿:点赞的人更棒
      • 做梦枯岛醒:支持
        木木仨儿:谢谢!:blush:

      本文标题:LFilePicker---文件选择利器,各种样式有它就够了

      本文链接:https://www.haomeiwen.com/subject/pgqcattx.html