一、DistributedMail演示效果
(一)项目效果展示
(二)提示在多设备调试过程中的注意
想要多设备调试务必在Tools下面选择Super device。如果选择单个设备并进行分布式操作就会出现:
选择完多设备后,务必分别在两个设备部署应用。如果只部署了一台也是不行的。
(三)解决页面显示的问题
需要注意的是,因为原文件布局的原因,迁移到其他设备的页面布局出现了问题,在远程模拟器上呈现的就是迁移到其他设备的页面的确定按钮看不见。这最开始属实把我给整懵了。
如下:
百二秦关终属楚!!!!找了半天终于弄明白了并解决。
手机快捷控制栏把按钮遮盖了
1.分析问题:
- 要么是dialog_layout_device.xml布局出现了问题,把下面的组件挤出去了;
- 要么是DeviceSelectDialog.class中创建的ListDialog的设置出现了问题;
- 要么是手机快捷控制栏把按钮遮盖了。
2.调整dialog_layout_device.xml布局,发现此布局为方向布局,按权重分配高度,其中ListContainer的ohos:weight=“1”,故删去此行并把高度设为150vp(总共300vp,迁移到其他设备的Text50vp,最后的水平方向容器)(确定、占位、取消三个组件)共占100vp)其结果如下图:
3.确定是ListDialog弹窗的问题就返回DeviceSelectDialog.class中去分析
(1)分析大致结构(这里就不具现化了,后面会对整个工程进行剖析)
(2)控制变量进行调试,发现把弹窗放在屏幕中间,取消和确定按钮可以出现。
最终确定是手机快捷控制栏把按钮遮盖了,最终解决方案,为了保证ListContainer可以很好的展示出可迁移设备且弹窗看起来更大气一点,dialog_layout_device.xml只把总体方向布局的高度变为ohos:height=“400vp”,把对齐方式改为居中。setAlignment(LayoutAlignment.CENTER);
如果还是想把弹窗弄在下面,且可以显示取消和确定按钮,就把setAlignment(LayoutAlignment.BOTTOM);布局文中下方留出100多的vp给手机快捷控制栏就行。(具体操作把ListContainer的ohos:weight="1"删去,对整体布局的高度进行具象化,即不按比例按数值)
最终效果:
二、工程目录分析
三、权限申请
很明显的,在此应用部署后,有两个权限弹框弹出。
- 第一个是访问图片和媒体的权限
- 第二个是使用多设备协同的的权限
但其实本应用申请了六个权限:
在MainAbility中的onStart()函数中:
<a name=“permission”></a>大家有没有想过这样一个问题:为什么这里permission里就三个权限,其他三个权限呢,为什么这里有三个权限,工程演示的时候却是有两个确定弹框呢。其原因:
敏感权限的申请需要按照动态申请流程向用户申请授权。非敏感权限不涉及用户的敏感数据或危险操作,仅需在config.json中声明,应用安装后即被授权。另外三个是非敏感权限。
应用动态申请权限而应用最开始只请求了两个权限。另外一个修改本地图片和媒体的权限并没有开始申请仅此而已。
- //访问图片和媒体
- "ohos.permission.READ_USER_STORAGE",
- //允许不同设备间的数据交换。
- "ohos.permission.DISTRIBUTED_DATASYNC"
对于权限的申请有代码示例工程(Permission),之后会对权限进行更全面的学习并对工程进行更全面的剖析。
获取分布式设备即MailEditSlice中setClickAction方法
四、界面分析(重点layout的梳理)
1.在界面分析的时候,发现layout的xml文件标红,发现代码示例工程为SDKversion2.0所以出现了问题。下面是一个例子其他的不列全。<a name=“version”></a>
2.且未用string.json保存字符串<a name=“string”></a>
3.对moudle_mail_edit.xml进行布局分析其他几个Layout组件很少就不赘述了。
五、页面梳理(slice的梳理)
1.打开MailEditSlice,发现不规范的地方,关于final的添加。
2.对其分析(关于页面跨设备迁移看我前一篇文章PageAbility全面解析有详解)
六、邮件正文数据、邮件初始化、邮件数据处理
- bean/MailDataBean.java,用于表示邮件正文数据
- MailDataBean.java中对邮件数据进行封装,对Param页面间传递的信息进行处理
- MailEditSlice页面中,我们把邮件内容初始化即上面slice中fillview部分
- onSaveData()和onRestoreData()方法来进行传递和恢复
预处理:
七、问题总结
1.(未解决)怎么使得弹窗不被手机快捷栏遮挡,就像官方文档给的图一样。
2.(已解决)本应用申请了六个权限,但MainAbility中requestPermission()只有三个,而且项目演示中,最开始只有两个权限申请弹窗。笔者已解决在文中权限申请部分。
3.(已解决)因为版本原因(代码示例工程为SDKversion2.0所以出现了问题),
4.(已解决)且未用string.json保存字符串