51CTO鸿蒙社区服务卡片应用设计 原创 精华
目录
前言
上个月华为发布了鸿蒙,我的使用感受就是两个字,舒服。特别是服务卡片,便捷的信息展示,服务高效直达。这么形容不够直观,用个项目给大家展示下。
假如51鸿蒙社区出了鸿蒙版,本项目中包含的内容和图片仅供学习和技术交流。
我平时经常在PC端逛51cto的鸿蒙社区,好多知识都是在社区学习的。但是有时候不方便开电脑,用手机就需要打开微信,点公众号搜索技术社区,然后点击逛社区,有点麻烦。如果此时有鸿蒙的服务卡片话,操作就简单了,只需要解锁,点击卡片,巴适啊。每次用手机进社区刚巧能节省大约10s,不要小看这几秒钟,以鸿蒙的体量,每人每天这么几次节省的时间就是天文数字。
接下来就具体分析下服务卡片究竟可以干哪些事情?
一、文章推荐服务卡片
社区访问最多的就是首页的“推荐内容”,而服务卡片正是为了提供用户容易使用且一目了然的信息内容,既然如此那就将“推荐内容”制作成服务卡片。
1.界面设计
服务卡片有4种尺寸,分别是1×2微卡片、2×2小卡片、2×4中卡片、4×4大卡片。显然1×2微卡片无法满足制作推荐内容卡片的需求。所以选择其他三种尺寸的服务卡片。
从上图可以看出,服务卡片可以实现在不同终端设备上的展示和自适应,但其实设计这种多终端多尺寸的服务卡片,代码却并不复杂。下面是我使用js开发的页面内容相关的代码。
可以使用少量的代码,实现在手机和平板2个终端6个尺寸的服务卡片,使用鸿蒙的原子布局能力。点击查看原子布局官方文档
主要就是通过样式display-index值从小到大的顺序进行隐藏。
这里说下我遇到的坑,第一行标题中的置顶和精,使用的是<span>组件,但是<span>的样式目前还不支持背景颜色设置,所以要想实现图中展示的效果,还得将代码稍微改动下,用<stack>曲线救国。
这样就可以完整显示一条文章内容信息了,接下只需要放入list列表组件,就可以实现整个推荐文章的列表页面了。
2.卡片更新
接下来使用服务卡片自带的卡片管理服务,实现卡片周期性刷新等。参考官方文档
只需要在config.json中开启服务卡片的周期性更新,在onUpdateForm(long formId)方法下执行数据获取更新。
config.json文件“abilities”的forms模块配置细节如下
可以在配置文件中设置定时或者定点更新卡片,当更新触发时会调用MainAbility下的onUpdateForm(long formId)方法
3.POST请求
而上面的方法最终调用了卡片控制器WidgetImpl的方法updateFormData()。所以最终需要卡片控制器的updateFormData()中,添加如下更新代码:
在上述的代码中,使用了两个包需要导入,同时需要开启程序的联网权限
4.添加权限和依赖包
要在config.json配置文件的module中添加:“reqPermissions”: [{“name”:“ohos.permission.INTERNET”}],
添加依赖包:找到entry/build.gradle文件,在dependencies下添加
POST请求最终会得到一段JSON格式的字符串,内容如下图,
5.解析JSON
但是返回是JSON格式需要进行解析,用的就是前面导入的依赖包fastjson,选择fastjson而不是jackson,是为了java类中只写要解析的数据,其他不需要的可以不写,参考下面的代码。如果不想自己写,也可以百度搜 ”JSON生成Java实体类“,可直接生成。
在更新数据前,需要设置卡片的index.json内容如下,这个文件的内容和上面我们进行post请求数据时的返回内容格式一致,这样就可以在更新卡片内容时,直接更新list的内容。
二、问答服务卡片
接下来是问答模块的服务卡片,效果如图
这个服务卡片和前面的文章卡片类似,区别就在于POST的请求方法,和JSON的返回值格式不太一样,掌握了方法,稍微修改一下即可,贴一下POST的内容吧
服务卡片除了信息展示,还有一个重要的功能,通过轻量交互行为实现服务直达、减少层级跳转的。前面的文章推荐卡片没有说跳转,是因为我在list列表的跳转事件上遇到一个坑。
卡片支持click通用事件,事件类型:跳转事件(router)和消息事件(message)。详细说明参考官方文档
消息事件(message)
-
在index.hml中给要触发的控件上添加onclick,比如:onclick=“sendMessageEvent”
-
在index.json中,添加对应的actions
-
如果是消息事件(message)当点击带有onclick的控件时,会触发MainAbility下的这个函数
-
最后调用卡片控制器 Widget1Impl 中的onTriggerFormEvent()
跳转事件(router)
-
在index.hml中给要触发的控件上添加onclick,比如:onclick=“sendRouteEvent”
-
在index.json中,添加对应的actions,跳转事件要多加一个参数"abilityName",指定要跳转的页面
-
如下图所示添加一个Page Ability,比如:RoutePageAbility
IDE会自动在config.json中增加这个页面,没有这个配置信息是无法调用的。
-
新建完成之后会增加RoutePageAbility 和 slice/RoutePageAbilitySlice 两个文件,可以在下面的代码中添加参数验证
list跳转事件
list组件只能添加一个onclick,所以就有个问题,在点击的同时还需要获取点击的是list列表中的哪一项。
这个坑折磨了我好久,最终我发现在index.json中,可以使用idx获取到hml页面list的元素变量和索引。但是在官方文档并没有找到相关的内容,尝试了很久才解决这个问题。
三、荣誉认证卡片
这两个服务卡片的和之前的卡片略有不同,主要是因为这两个服务卡片的信息需要登录账号才能够获取到.
1.webview
在鸿蒙中webview提供在应用中集成Web页面的能力。首先在打开APP的时候显示HarmonyOS技术社区的首页,在base/layout/ability_main.xml中添加
接着在com/liangzili/demos/slice/MainAbilitySlice.java的启动函数中添加如下代码
2.取消标题栏
但此时还有个小问题就是这个标题栏,强迫症的我着实觉的太难受,需要添加一个配置取消这个标题栏,配置是网上查的,啥意思我不太清楚,能用就好
在abilities下要隐藏标题栏的页面下添加下面配置,添加在哪个页面隐藏哪个。
3.保存cookie
主要用到的就是CookieStore,在文档中CookieStore有一个persist()方法,看描述应该就是保存cookie信息的意思,参考官方文档
Modifier and Type | Method | Description |
---|---|---|
abstract void | persist() | Saves cookies to the device’s persistent storage. |
这里我又双叕遇到一个坑,这个persist()方法我尝试了很多次,只要清理后台,cookie就会丢失,难道是我对这个方法有什么误解,打开的方式不对。到现在也没有成功,有知道如何使用的大佬,麻烦告知一声,这里先行谢过了。
4.使用偏好型数据库
没办法只能取出cookie的内容,然后一条条保存到数据库了。首先制造一个保存指定域名Cookie的函数,使用关系型数据库
接着制造从数据库中读取Cookie的函数
最后在启动时调用readCookie,结束时调用saveCookie就可以了。
不过这样操作会触发一个新的问题,这里就不深究了,已经偏离服务卡片的初衷了。这里要感谢下社区@Whyalone,感谢指点迷津。听说51CTO官方版的服务卡片也马上上线了,期待啊!!
以上就是我制作51社区服务卡片的过程了,如果对你们有所帮助别忘了点赞支持啊,如果有问题也欢迎留言进行交流。
给大佬跪了!希望社区卡片早日上线
优秀~\(≧▽≦)/~~\(≧▽≦)/~
赞,来的正及时
路人甲前来打个酱油
太赞了!用微信打开逛社区确实耗时间,如果有小卡片之间就减少了体验层级
服务卡片用在社区这里真的秒,期待app快出来。到时候社区说不定就因此更加活跃了
小哥厉害!!学习了!
期待社区能做出楼主这样的效果。
确实,我也期待官方版快点来啊
看起来不错哦
那个cookieStore 中的persist(),我想了好久都没解决。后来还是用自带的轻量级数据库preferences解决,直接getcookie保存到preferences。每次加载webview.load前先setcookie解决。
能不能把代码放在Gitee?