前言
这一篇文章里面我们继续认识几个Accompanist里面的组件,大家可以去这里查看Accompanist的所有组件库。
SystemUiController
Accompanist里面有一个组件是专门用来控制Android系统导航栏,状态栏的UI的,那就是SystemUiController,我们统称为系统ui,它用来更改在黑夜模式或者白天模式下,系统ui上icon的颜色以及背景色
依赖地址
implementation "com.google.accompanist:accompanist-systemuicontroller:<version>"
现在最新版本为0.31.1-alpha
如何使用
使用这个库去更改系统ui很容易,首先需要使用rememberSystemUiController()创建一个SystemUiController实例,然后使用它的setSystemBarsColor函数去更改背景色以及icon颜色
setSystemBarsColor函数的第一个参数是背景颜色,第二个参数是个布尔值,当为false的时候,表示当前为白天模式,icon应该成浅色,当为true的时候表示是黑夜模式,icon应该是深色,代码当中先将系统ui背景色设置为红色,模式定为白天模式,我们的应用就变成了下面这样
我们再加几个按钮,动态设置下系统ui的颜色
页面上加了个按钮用来切换白天黑夜模式,加了一排色块用来设置系统ui背景色,达到的效果如下所示
一切都运行的不错,不过这里是存在适配问题的,在api小于26的设备上,底部导航栏的icon是改变不了的,我们用一个api25的模拟器跑下看看
我们看到背景色切换一切正常,但是改变黑白模式时候,顶部状态栏的icon颜色改变了,但是底部导航栏的icon颜色没有改变,只是略微更改了一下背景色的透明度,另外在api低于23的设备上,顶部的状态栏icon的颜色也不会随着黑白模式切换而改变,我们使用一个api22的模拟器看下
我们看到切换黑白模式时候,都是在更改背景色的透明度,而icon的颜色却不变了,所以如果要使用SystemUiController这个组件,这些适配问题需要注意下
WebView
在之前如果想要在Compose所有组件中找出一个能展示网页或者地图的,是找不到的,因为根本就没有提供,我们只能用Compose提供的AndroidView组件,在里面去调用android view里面的控件比如WebView来展示,像这样
在factory里面将WebView绘制到Compose节点上,update是等完全绘制完毕以后去调用,可以在update里面做一些初始化工作,但这样的做法显得太粗暴,开发者需要展示个Webview则必须套在一个AndroidView里面,事实上对于开发者来讲,AndroidView这一层完全不关心,多了这一层反而会影响代码可读性,所以谷歌为了优化这一点,在Accompanist里面增加了一个组件,也叫webview,这个webview就完全属于Compose的组件了
依赖地址
implementation ”com.google.accompanist:accompanist-webview:<version>“
目前最新版本是0.31.1-alpha
如何使用
首先看下如果要使用Webview组件的话,需要传哪些参数
第一个必传参数WebviewState,封装了一些加载网页所需要的元素,比如链接地址,加载状态以及加载失败的错误信息,使用rememberWebViewState函数创建,这个函数的入参就是需要加载的网页链接,在函数里面会生成一个WebviewState
captureBackPresses参数控制网页是否响应回退键或者滑屏事件,默认为true,onCreate是对webview进行一些初始化操作,比如settings的设置,JavasriptInterface的设置等,onError是监听网页加载失败返回的一些信息,封装在了WebResourceError,我们现在就用Webview来加载一个百度的页面
是不是变得精简好多,比起之前的用法,新的Webview暴露出来的都是一些主要的信息,比如设置加载链接,必要的settings设置之类的,其实我们看WebView里面,就是在用AndroidView实现
现在我们利用onError参数,给页面增加点交互,当网页加载失败的时候,在WebView上面增加一个ErrorPage,先创建出三个变量用来接收WebResourceError里面的数据
errorLink是加载失败的链接,errorDes是加载失败的描述,errorCode是加载失败的状态码,然后在onError里面去拿对应数据,并且让这些数据展示在一个Column里面
我们让WebView跟Column在一个Box里面,这样当errorLink为空的时候,也就是加载成功的时候,依然能展示出WebView,现在将加载的链接换成一个无效的链接再试试
错误页就长右边那个样子,我们再增加两个按钮,一个按钮用来加载正常页面,一个按钮用来加载一个无效链接,目的是让错误页根据onError的返回信息来显示
这里根据布尔类型变量normalPage来生成不同的WebViewState,另外在两个按钮的点击事件里面,分别改变normalPage的值,效果如下
Permissions
现在几乎每个app里面都会用到权限申请这个功能,主要是有些权限如果不经过用户同意的话,是会影响使用的,所以对于Compose来讲,肯定也不会遗漏掉这么重要的一个环节,在Accompanist里面就有一个组件库是用来做这件事情的,那就是Permissions
依赖地址
implementation “com.google.accompanist:accompanist-permissions:<version>”
目前最新版本为0.31.1-alpha
如何使用
比如说我有个应用需要对Manifest.permission.READ_PHONE_STATE这个权限进行授权,那么首先就需要拿到这个权限的PermissionState,通过函数rememberPermissionState去创建它
PermissionState里面有三个属性,分别是权限名称permission,权限状态status以及申请权限操作launchPermissionRequest
首先可以通过status的isGranted属性去判断该权限有没有被授权
否则的话就要去判断这个权限是第一次去申请,还是被用户拒绝过,这是两种场景,提示语也不一样,我们用status里面的shouldShowRationale,true的时候表示被用户拒绝过,false的时候表示是第一次申请授权,无论哪种情况都应该有一个地方提供给用户去申请权限,我们使用PermissionState的launchPermissionRequest函数
我们去运行一遍这段代码,先去正常同意授权
页面上已经处于已授权的状态,下面是拒绝该权限
一个权限的授权操作基本就是这样,Permissions组件除了支持对一个权限进行授权之外,还支持对多个权限进行授权,使用rememberMultiplePermissionsState函数来创建一个
MultiplePermissionsState对象,里面传入一个权限的数组就可以了
MultiplePermissionsState里面的属性如下所示
基本都能看得懂,其中通过属性revokedPermissions来获取被拒绝的权限列表,通过
allPermissionsGranted来判断是否所有权限都授权成功,通过
launchMultiplePermissionRequest()函数来对所有权限进行授权请求,我们更改下上面的例子,来同时对两个权限进行授权操作
总结
本篇文章对SystemUiController,WebView以及Permissions这三个组件进行了使用介绍,这三个组件目前还都没有被挪入到正式库里面去,但感觉这些也都是早晚的事情,因为这三个组件牵扯到的场景都是平时开发过程当中经常会遇到的,这三个组件的重要性不差于那些已经被挪入到正式库的组件