Login

13928244600bandao-sports@wangaocn.com

  1. 半岛 > 新闻动态 > 媒体报道

别羡慕苹果的小部件了安卓也有!

作者:小编 日期:2024-06-08 08:13:26 点击数:

  别羡慕苹果的小部件了安卓也有!大家好,我是皇叔,最近开了一个安卓进阶涨薪训练营,可以帮助大家&职场瓶颈,从而度过难关,进入心仪的公司。

  2020年九月苹果的 iOS 14 正式版本发布,其中的一项重大更新就是苹果也支持小部件了!不容易啊,安卓好多年前拥有的功能现如今苹果终于用上了,先来看看苹果中的小部件样式吧!

  苹果的小部件的确不错,还挺好看,但是安卓的其实也不差,前段时间写了一个完全用 Compose 写的天气应用:从零到一写一个完整的 Compose 版本的天气(),想着苹果的天气小部件挺好用,给安卓也整一个吧!就有了今天的文章,来看看今天实现的最终效果吧:

  虽然安卓在很多年前就有了小部件,但小部件在安卓手机里的使用并不多,甚至可能说很少,最多也就是手机出厂的时候自带的时间小部件。。。其实很多咱们常用应用都有很多小部件,由于使用的确实不多,所以存在感很低(顺带吐槽下,常用的软件都太流氓了,每个应用都有一堆功能一样的小部件,比如:抖音有好几个、头条也有好几个、爱奇艺、优酷等就不说了半岛·体育中国官方网站平台登陆。。。)

  为什么安卓中的小部件很少人使用呢?主要还是样式太丑,还有就是像上面说的那样太流氓就不想用。Google 其实都快把小部件给忘记了,但去年让苹果给提了下醒,想起了安卓中还有小部件这个东西呢,于是痛定思痛,将小部件做了一些大的更新及升级。

  由于小部件是依附在桌面上的,所以并不属于原本应用的进程,而如果想要跨进程修改布局的话就需要使用到 RemoteViews ,但 RemoteViews 不能说是难用,那是相当难用,不仅不能使用自定义 View,连咱们常用的 RecyclerView 等控件都不能使用,只能使用官方固定的几种控件,可以支持以下布局类:

  注:这块的控件指的是 Android 12之前的,Android 12中新增了一些新的控件,在下面的部分中会有介绍。

  在之前,用户如果想要重新设置小部件的话只能删除了再重新添加,但是在 Android 12 中,用户将无需通过删除和重新添加 widget 来调整这些原有设定。

  上面配置有两个,widgetFeatures 就是 Android 12中新增的可重新设置小部件的配置项,另外一个是配置小部件的 Activity,想要使 widgetFeatures 起作用的话必须要配置 Activity,这很好理解,如果都不知道去哪配置小部件何谈重新设置呢!

  在 Android 12之前,Android 中的小部件大小其实特别混乱,每个应用在小部件中标柱的大小基本都是错的,比如应用写的大小是 4 * 1 ,当你将页面布局调整之后应用大小就有可能发生变化,就不再是 4 * 1 的大小了。

  targetCellWidth:定义设备主屏幕上的小部件默认宽度所占格数(即使不同型号的手机中也会占定义好的格数,但手机系统版本必须在 Android 12 及以上)

  上面这几个控件大家应该非常熟悉了,但在 Android 12 之前在小部件中想要使用的话也是不可能的。

  上面叨叨了这么多,先是介绍了下小部件的前世今生,然后又说了下 Android 12中的更新内容,终于要准备干活了。

  如果想要在 Android 中添加一个小部件的话首先应该在 AndroidManifest.xml 中进行声明,因为小部件实际上也是一个 BroadcastReceiver,大家都知道四大组件想要使用的话都需要在 AndroidManifest.xml 中进行声明,所以咱们先来在清单中声明小部件。

  上面在清单文件中声明了小部件,下面来编写下小部件的配置文件,根据上面的代码可以看到这个配置文件放在了 xml 文件下,具体路径为:res - xml,如果本地没有这个文件夹的话创建一个就好。

  可以看到这里已经使用到了上面讲的 Android 12中的新的配置,并且设置了最小的宽高,还有预览图片等等,下面来详细看下每一项配置都是干啥的吧。

  configure:定义要在用户添加小部件时启动以便用户配置小部件属性的 Activity。

  previewImage:指定预览来描绘小部件经过配置后是什么样子的,用户在选择小部件时会看到该预览。

  autoAdvanceViewId:指定应由小部件的托管应用自动跳转的小部件子视图的视图 ID。

  resizeMode:指定可以按什么规则来调整微件的大小,可选值为“horizontalvertical”,一般默认设置横竖都可以进行调整。

  配置文件写好了来编写下布局吧,来考虑下布局应该怎么写,通过文章开头的图可以知道这是一个 StackView ,那就先来写下根布局吧。

  由于咱们的布局中有 StackView ,包含集合的小部件除了上面中列出的要求之外,要使包含集合的小部件能够绑定到 RemoteViewsService,还必须在清单文件中使用 BIND_REMOTEVIEWS 权限来声明该服务。这样可防止其他应用自由访问小部件的数据。

  与常规小部件一样,AppWidgetProvider 子类中的大部分代码通常都在 onUpdate 中。在创建包含集合的小部件时,必须调用 setRemoteAdapter 来设置适配器,这样将告知集合视图要从何处获取其数据。

  上面编写了 RemoteViewsFactory 的实现,省略了一些不重要的方法,大家可以去源码中进行查看。

  配置 Activity 在上面咱们已经说过如何添加到小部件的配置文件中,剩下的就和普通的 Activity 一样了。

  看着代码多,其实布局很简单,一个线性布局包裹着标题、城市ViewPager、确定和取消按钮,然后通过高阶函数的方式将确定按钮的点击事件回调出去。

  OK,到这里本篇文章基本就算结束了,上面的这些一般在别的博客中都能搜到,但是重点来了,有很多东西网上是搜不到的,包括在官方文档中写的也是很笼统,并没有实际的应用案例,下面就来详细说一说吧。

  在苹果中小部件的布局在添加的时候就固定好了,后面是不可以进行修改的,想要修改的话只能是删除掉然后重新进行添加,但是在安卓中小部件的大小是可以进行拉伸的,长按即可进行宽高的调整,所以就难免出现布局适配的问题。

  在 Android 12 之前如果想适配不同宽高下显示不同布局的话需要重写下 onAppWidgetOptionsChanged 方法,然后从中获取到当前小部件的最小宽高,根据宽高的不同就可以进行布局适配了。

  上面代码中提到了一个 getCellsForSize 方法,这个方法是根据官方文档中写的计算小部件格数的方法进行定义的,来看下吧:

  注意!!!这里所计算出的单元格数量不一定是正确的,在有的手机上可能没问题,但一些手机上就有可能出问题,大家一定要注意,这也是没办法的事,手机厂商太多了,每个桌面的实现方式也略有不同,这事是正常的。

  在 Android 12 之后,可以通过响应式布局来进行适配,首先需要创建一组不同尺寸的布局,然后调用 updateAppWidget 函数,并传入一组布局,当小部件尺寸发生变化时,系统会自动更改布局。

  这样确实会简单一些,相当于是 RemoteViews 内部为我们做了处理,无需再重写 onAppWidgetOptionsChanged 方法了,但这样的话只能在 Android 12 及之后的版本中进行使用,大家根据需求来使用吧。

  这个问题是真的挺恶心,也有可能是我水平有限,官方给出的刷新是 notifyAppWidgetViewDataChanged 方法,这块搞的时候差点给我搞疯。。。

  我之前是将天气的数据请求放在 onCreate 方法中,然后通过 runBlocking 方法将异步转为同步,获取到数据再执行下一步,但这样的话就会 anr。。

  这块是为了展示天气背景而出的问题,小部件中不支持自定义 View,所以就只能通过图片本身了,需要将图片加上圆角,这很简单,网上一搜一大堆,但我设置完了之后并不是我想要的效果,我想要的是宽高一样,这也简单,加一行配置就行:

  再次运行发现设置的圆角没了。。。好吧,被切了,那只能先自己切成想要的大小,然后再添加圆角了。。。


随便看看