十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这里我先公布下答案:不需要
创新互联建站是一家集网站建设,平遥企业网站建设,平遥品牌网站建设,网站定制,平遥网站建设报价,网络营销,网络优化,平遥网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
我要实现读取已安装应用列表功能,Google了一下,可以通过PackageManager.getInstalledPackages()方法获取,我手头有三台手机,分别是华为Nexus 5X、Meta9、Vivo X20,写了个Demo在这三个手机上进行测试,测试结果如下:
我没有申请任何权限,Vivo X20为什么会出现申请读取已安装应用列表权限对话框呢?为什么是有时候能获取到全部已安装应用列表,有时候获取不到?
Google一下,看有没有和我类似的问题,找到了一篇:
Android 如何完整的获取到用户已安装应用列表
这篇文章中,作者有个结论:『国内部分厂商比如华为、oppo,他们将”获取用户已安装应用列表”的权限暴露给了用户,让用户可以自由决定允许或者禁止应用访问该信息。』
Nexus 5X中没有找到读取已安装应用列表权限。
这里有提到华为,我打开meta 9的权限列表看了一下有读取已安装应用列表权限,我的Demo对应的这个权限默认是打开的,所以meta 9是能获取到全部已安装应用列表。
再看下Vivo X20,在打开Demo的时候弹出申请权限对话框了,说明Vivo也属于那部分国内厂商,由于在弹出申请读取已安装应用列表权限对话框时,我允许了,所以打开Vivo X20的读取已安装应用列表权限时,这里的状态是打开的,但是,点进去一看,暗藏玄机,这里还有一个 安全等级,分为高、中、低 ,我的Demo属于高,看看其他应用呢?微信安全等级属于低、支付宝属于低,读取不到应用列表难道和这个 安全等级 有关系吗?
我手动将我的Demo的 安全等级 调整为低,再打开Demo,奇迹发生了,没有弹出申请读取已安装应用列表权限对话框,并且获取到了全部已安装应用列表。
Android 读取已安装应用列表不需要申请权限,因为Android权限列表中没有权限是用于读取已安装应用列表的。
如果想要获取Vivo X20这种有 安全等级 的手机中的已安装应用列表,由于这种 安全等级 我们无法决定,所以只能通过反向查找的方式,即通过包名能否找到应用,从而判断是否安装了某应用。
这种方法获取不到全部已安装应用列表,只能获取到指定的应用。
如果有比较了解权限的同学觉得我有写的不对的地方,或者对于获取已安装应用列表有更好的方法,欢迎留言交流!
将课本的章节以多级列表的形式显示。
1.嵌套多级 RecyclerView,两级列表还好说,每多一级都是一场噩梦。
2.ExpandableListView?但是ExpandableListView只支持两级,不满足需求。
3.一个RecyclerView或者 ListView 来实现,每一级节点的要素有:当前节点id、父级节点id即pid,显示的内容。
控制父子之间联动的选中与取消状态,只需调用setChecked方法既可,注意如果在setOnCheckedChangeListener中处理会有问题:因为如果要子节点/父节点选中或者取消需要刷新页面,而刷新页面又会触发viewHolder.cb.setChecked(true/false);的判断从而又会进入setOnCheckedChangeListener,会导致如果父节点选中某些子节点取消不了的情况。
通过一个ListView来展示所有数据,每一级内容的显示根据当前展示数据的等级缩进一定的padding值,让我们看起来有缩进效果。
使用过程中感觉不是很舒服的地方在于最终用于显示在界面实体Bean并不是我们传进去的数据,而是经过转化并且过滤的数据,这样最直接的影响就是在我新增数据的数据之后,拿着Adapter来刷新的时候,并没有任何效果。因为我们没有将后面新加的数据进行转化。
而我们如何能在不改变原有数据结构的基础上,添加我们的新内容,并保持原有的选中或者展开正常呢?我的想法是这样的,如果可以直接给它传入转化后的Node节点类型数据就好了,我想到了继承,让实体类去继承基类Node,但一旦继承Node则意味着实体类就不能再继承其他类了,感觉不是很灵活,而且也影响了实体类本身的结构。后来想到了包装设计模式的一些东西,那我就在实体类外再包上一层,也就是将实体类传给Node,最终我们使用的还是Node,但也可以用node.bean很轻松的取出实体类做其他操作,并且实体类本身的结构并没有被破坏。
在此基础上,因为我们的Node不需要转化重新创建,那么它就可以保存一些状态比如展开、选中等等,而在新加入数据时只需标记下新加入的数据,只需对新加入的数据进行初始化状态,已有老数据不进行状态改变:
项目地址:
原文连接:
在UI中经常会使用到下拉列表,在android控件中有两个下拉列表控件:
在xml中添加控件的使用:
主题:
这些都没有达到我要的效果:
android:entries // 传入的是values文件夹下的arrayx.xml内的数据
android:spinnerMode //显示模式有popmenu和dialog两种
android:prompt //当显示模式为dialog时生效,作用为显示dialog的标题内容