From 5602f6f6b325cdf9e37710528c956ee88251b014 Mon Sep 17 00:00:00 2001 From: zengyawen Date: Fri, 26 Aug 2022 17:49:53 +0800 Subject: [PATCH] update docs Signed-off-by: zengyawen --- zh-cn/application-dev/Readme-CN.md | 1 + zh-cn/application-dev/faqs/Readme-CN.md | 15 + zh-cn/application-dev/faqs/faqs-ability.md | 62 ++++ .../application-dev/faqs/faqs-connectivity.md | 31 ++ .../faqs/faqs-data-management.md | 24 ++ .../faqs/faqs-development-board.md | 51 ++++ .../faqs/faqs-device-management.md | 24 ++ .../faqs/faqs-file-management.md | 36 +++ zh-cn/application-dev/faqs/faqs-graphics.md | 15 + zh-cn/application-dev/faqs/faqs-hdc-std.md | 63 ++++ zh-cn/application-dev/faqs/faqs-ide.md | 19 ++ zh-cn/application-dev/faqs/faqs-native.md | 57 ++++ .../faqs/faqs-third-party-library.md | 9 + zh-cn/application-dev/faqs/faqs-ui-ets.md | 282 ++++++++++++++++++ zh-cn/application-dev/faqs/faqs-ui-js.md | 96 ++++++ .../figures/zh-cn_image_0000001361254285.png | Bin 0 -> 20550 bytes 16 files changed, 785 insertions(+) create mode 100644 zh-cn/application-dev/faqs/Readme-CN.md create mode 100644 zh-cn/application-dev/faqs/faqs-ability.md create mode 100644 zh-cn/application-dev/faqs/faqs-connectivity.md create mode 100644 zh-cn/application-dev/faqs/faqs-data-management.md create mode 100644 zh-cn/application-dev/faqs/faqs-development-board.md create mode 100644 zh-cn/application-dev/faqs/faqs-device-management.md create mode 100644 zh-cn/application-dev/faqs/faqs-file-management.md create mode 100644 zh-cn/application-dev/faqs/faqs-graphics.md create mode 100644 zh-cn/application-dev/faqs/faqs-hdc-std.md create mode 100644 zh-cn/application-dev/faqs/faqs-ide.md create mode 100644 zh-cn/application-dev/faqs/faqs-native.md create mode 100644 zh-cn/application-dev/faqs/faqs-third-party-library.md create mode 100644 zh-cn/application-dev/faqs/faqs-ui-ets.md create mode 100644 zh-cn/application-dev/faqs/faqs-ui-js.md create mode 100644 zh-cn/application-dev/faqs/figures/zh-cn_image_0000001361254285.png diff --git a/zh-cn/application-dev/Readme-CN.md b/zh-cn/application-dev/Readme-CN.md index 19b9ca337e..1a4154f39b 100644 --- a/zh-cn/application-dev/Readme-CN.md +++ b/zh-cn/application-dev/Readme-CN.md @@ -49,6 +49,7 @@ - [Native API参考](reference/native-apis/Readme-CN.md) - [标准库](reference/native-lib/third_party_libc/musl.md) - [Node_API](reference/native-lib/third_party_napi/napi.md) +- [常见问题](faqs/Readme-CN.md) - 贡献 - [参与贡献](../contribute/贡献文档.md) diff --git a/zh-cn/application-dev/faqs/Readme-CN.md b/zh-cn/application-dev/faqs/Readme-CN.md new file mode 100644 index 0000000000..7eeb2c756a --- /dev/null +++ b/zh-cn/application-dev/faqs/Readme-CN.md @@ -0,0 +1,15 @@ +# 常见问题 + +- [Ability框架开发常见问题](faqs-ability.md) +- [UI框架(JS)开发常见问题](faqs-ui-js.md) +- [UI框架(eTS)开发常见问题](faqs-ui-ets.md) +- [图形图像开发常见问题](faqs-graphics.md) +- [文件管理开发常见问题](faqs-file-management.md) +- [网络与连接开发常见问题](faqs-connectivity.md) +- [数据管理开发常见问题](faqs-data-management.md) +- [设备管理开发常见问题](faqs-device-management.md) +- [Native API使用常见问题](faqs-native.md) +- [三四方库使用常见问题](faqs-third-party-library.md) +- [IDE使用常见问题](faqs-ide.md) +- [hdc_std命令使用常见问题](faqs-hdc-std.md) +- [开发板](faqs-development-board.md) diff --git a/zh-cn/application-dev/faqs/faqs-ability.md b/zh-cn/application-dev/faqs/faqs-ability.md new file mode 100644 index 0000000000..ffc4e0123d --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-ability.md @@ -0,0 +1,62 @@ +# Ability框架开发常见问题 + + + +## Stage模型中是否有类似FA模型的DataAbility的开发指导文档 + +适用于:OpenHarmony SDK 3.2.3.5版本, API9 Stage模型 + +Stage模型中DataShareExtensionAbility提供了向其他应用共享以及管理其数据的方法。 + +参考文档:[数据共享开发指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/database/database-datashare-guidelines.md) + +## 拉起Ability为什么在界面上没反应? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +1. 如果是通过startAbility的方式拉起,检查want中abilityName字段是否携带了bundleName做前缀,如果有,请删除; + +2. 检查MainAbility.ts文件中onWindowStageCreate方法配置的Ability首页文件是否在main_pages.json中有定义,如果没有定义,请补齐; + +3. SDK和OpenHarmony SDK系统推荐同一天的版本。 + +参考文档:[OpenHarmony版本转测试信息](https://gitee.com/openharmony-sig/oh-inner-release-management/blob/master/Release-Testing-Version.md) + +## 调用方法的时候,如何解决方法内部的this变成undefined? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +方式一:在调用方法的时候加上.bind(this); + +方式二:使用箭头函数。 + +## 如何解决must have required property 'startWindowIcon'报错 + +适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 + +Ability配置中缺少startWindowIcon属性配置,需要在module.json5中abilities中配置startWindowIcon。 + +参考文档:[Stage模型配置文件](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/stage-structure.md) + + 示例: + +``` +{ + "module": { + // do something + "abilities": [{ + // do something + "startWindowIcon": "$media:space", + "startWindowBackground": "$color:white", + }] + } +} +``` + +## 如何获取设备横竖屏的状态变化的通知 + +适用于:OpenHarmony SDK 3.2.3.5版本, API9 Stage模型 + +使用Ability的onConfigurationUpdated回调实现,系统语言、颜色模式以及Display相关的参数,比如方向、Density,发生变化时触发该回调。 + +参考文档:[Ability开发指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ability/stage-ability.md) diff --git a/zh-cn/application-dev/faqs/faqs-connectivity.md b/zh-cn/application-dev/faqs/faqs-connectivity.md new file mode 100644 index 0000000000..8690d9c205 --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-connectivity.md @@ -0,0 +1,31 @@ +# 网络与连接开发常见问题 + + + +## Post请求时,extraData支持哪几种的数据格式? + +适用于:OpenHarmony SDK 3.2.2.5版本, API9 Stage模型 + +extraData代表发送请求的额外数据,支持如下数据: + +1. 当HTTP请求为POST、PUT方法时,此字段为HTTP请求的content。 + +2. 当HTTP请求为GET、OPTIONS、DELETE、TRACE、CONNECT方法时,此字段为HTTP请求的参数补充,参数内容会拼接到URL中进行发送。 + +3. 开发者传入string对象,开发者需要自行编码,将编码后的string传入。 + +## 如何理解http请求的错误码28? + +适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型 + +错误码28代表CURLE_OPERATION_TIMEDOUT 。网络请求底层使用libcurl库,更多错误码可以查看相应文档。 + +参考文档:[开发指南](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-http.md#response%E5%B8%B8%E7%94%A8%E9%94%99%E8%AF%AF%E7%A0%81)和[Curl错误码](https://curl.se/libcurl/c/libcurl-errors.html) + +## \@ohos.net.http.d.ts的response错误码返回6是什么意思? + +适用于:OpenHarmony SDK 3.2.3.5版本 + +6表示地址无法解析主机,可以尝试ping一下request中的url,确认是否可以ping通。 + +更多错误码参考[Response常用错误码](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-http.md#response%E5%B8%B8%E7%94%A8%E9%94%99%E8%AF%AF%E7%A0%81)或者[Curl错误码](https://curl.se/libcurl/c/libcurl-errors.html) diff --git a/zh-cn/application-dev/faqs/faqs-data-management.md b/zh-cn/application-dev/faqs/faqs-data-management.md new file mode 100644 index 0000000000..bdeef869a7 --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-data-management.md @@ -0,0 +1,24 @@ +# 数据管理开发常见问题 + + + +## 如何将PixelMap的数据存储到数据库中。 + +适用于:OpenHarmony SDK 3.2.3.5版本 + +PixelMap应该被转换成相应的ArrayBuffer再放进数据库。 + +参考文档:[readPixelsToBuffer](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-image.md#readpixelstobuffer7-1) + +## 如何获取rdb关系型数据库文件 + +适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 + +开发者可使用hdc_std命令拷贝文件,其中文件路径为: /data/app/el2/100/database/包名/entry/db/ ,然后拷贝该路径下后缀为 .db、.db-shm、.db-wal的文件,拷贝完成后,可以通过SQLite工具打开该数据库文件。 + +示例: + + +``` + hdc_std file recv /data/app/el2/100/database/com.xxxx.xxxx/entry/db/test.db ./test.db +``` diff --git a/zh-cn/application-dev/faqs/faqs-development-board.md b/zh-cn/application-dev/faqs/faqs-development-board.md new file mode 100644 index 0000000000..3ab491c0dc --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-development-board.md @@ -0,0 +1,51 @@ +# 开发板 + + + +## 如何获取开发板上截屏图片? + +适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型 + +- 方法一:点击开发板下拉控制中心的截屏按钮,截屏图片通过相册可以查看。 + +- 方法二:通过截屏脚本一键截屏,可以在电脑上查看。操作方法:Windows上连接开发板,然后电脑上新建文本文件,拷贝如下脚本内容,文件名后缀改为.bat文件(需要提前配置好hdc的环境变量),点击运行后,截屏图片与脚本在同一目录。 + 示例: + + + ``` + set filepath=/data/%date:~0,4%%date:~5,2%%date:~8,2%%time:~1,1%%time:~3,2%%time:~6,2%.png + echo %filepath% + : pause + hdc_std shell snapshot_display -f %filepath% + : pause + hdc_std file recv %filepath% . + : pause + ``` + +## RK3568板子和previewer上展示的效果差异较大,如何把previewer的尺寸调整成实际板子一样。 + +适用于:IDE 3.0.0.991 + +1. 给预览器新建Profile + ![zh-cn_image_0000001361254285](figures/zh-cn_image_0000001361254285.png) + +2. 新建Profile的具体参数可参考如下配置: + Device type : default + + Resolution: 720\*1280 + + DPI: 240 + +## 开发板安装驱动后设备仍然无法识别,设备管理器错误识别为其他设备:FT232R USB UART () + +可能原因:开发版的USB串口驱动没有安装。 + +解决办法:搜索FT232R USB UART确定,下载安装驱动即可。 + +## 在开发板上登录需要认证网络如何进行认证 + +适用于:OpenHarmony SDK 3.2.2.5版本 + +连接需要认证的网络后,用浏览器打开任意网址就可以进入认证页面。 + +如果开发板上没有浏览器,可以安装[浏览器Sample应用](https://gitee.com/openharmony/app_samples/tree/master/device/Browser)。 diff --git a/zh-cn/application-dev/faqs/faqs-device-management.md b/zh-cn/application-dev/faqs/faqs-device-management.md new file mode 100644 index 0000000000..b5bac9f878 --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-device-management.md @@ -0,0 +1,24 @@ +# 设备管理开发常见问题 + + + +## 如何获取设备的dpi值 + +适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型 + +导入@ohos.display包,通过getDefaultDisplay方法获取。 + +示例: + + +``` +import display from '@ohos.display'; +display.getDefaultDisplay((err, data) => { + if (err.code) { + console.error('Test Failed to obtain the default display object. Code: ' + JSON.stringify(err)); + return; + } + console.info('Test Succeeded in obtaining the default display object. Data:' + JSON.stringify(data)); + console.info('Test densityDPI:' + JSON.stringify(data.densityDPI)); +});https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-device-info.md) +``` diff --git a/zh-cn/application-dev/faqs/faqs-file-management.md b/zh-cn/application-dev/faqs/faqs-file-management.md new file mode 100644 index 0000000000..a6caa4a706 --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-file-management.md @@ -0,0 +1,36 @@ +# 文件管理开发常见问题 + + + +## 调用媒体库getAlbums方法,没有收到返回,也没有捕获到异常是为什么 + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +getAlbums方法需要权限:ohos.permission.READ_MEDIA,从[OpenHarmony权限定义列表](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/permission-list.md)查询知道ohos.permission.READ_MEDIA权限是需要用户授权。 + +1. 在module.json5中配置权限: + + ``` + "requestPermissions": [ + { + "name": "ohos.permission.READ_MEDIA" + } + ] + ``` + +2. 在MainAbility.ts -> onWindowStageCreate页面加载前需要增加用户授权代码: + + ``` + private requestPermissions() { + let permissionList: Array = [ + "ohos.permission.READ_MEDIA" + ]; + this.context.requestPermissionsFromUser(permissionList) + .then(data => { + console.info(`request permission data result = ${data.authResults}`) + }) + .catch(err => { + console.error(`fail to request permission error:${err}`) + }) + } + ``` diff --git a/zh-cn/application-dev/faqs/faqs-graphics.md b/zh-cn/application-dev/faqs/faqs-graphics.md new file mode 100644 index 0000000000..f72711aefb --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-graphics.md @@ -0,0 +1,15 @@ +# 图形图像开发常见问题 + + + +## 调用window实例的setSystemBarProperties接口时,设置isStatusBarLightIcon和isNavigationBarLightIcon属性不生效 + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +状态栏字体高亮属性的本质就只是让字体变成白色。调用window实例的setSystemBarProperties接口时,如果设置了状态栏内容颜色statusBarContentColor,就以开发者设置的颜色为准,isStatusBarLightIcon状态栏字体高亮属性就不生效;同理,如果设置了导航栏内容颜色navigationBarContentColor,isNavigationBarLightIcon导航栏字体高亮属性就不生效。 + +## 如何设置系统状态栏样式 + +适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 + +导入\@ohos.window模块,开发者可以使用window.setSystemBarProperties()接口设置状态栏样式属性,达到自定义样式的效果。 diff --git a/zh-cn/application-dev/faqs/faqs-hdc-std.md b/zh-cn/application-dev/faqs/faqs-hdc-std.md new file mode 100644 index 0000000000..90f627289b --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-hdc-std.md @@ -0,0 +1,63 @@ +# hdc_std命令使用常见问题 + + + +## 日志的常用命令 + +适用于:OpenHarmony SDK 3.2.2.5版本 + +清理日志:hdc_std shell hilog -r + +调大缓存到20M:hdc_std shell hilog -G 20M + +抓取日志:hdc_std shell hilog > log.txt + +## 日志限流怎么规避 + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +- 关闭日志限流 hdc_std shell hilog -Q pidoff + +- 关闭隐私标志 hdc_std shell hilog -p off + +- 增加日志buffer hdc_std shell hilog -G 200M + +- 关闭全局日志,只打开自己领域的日志 hdc_std shell hilog –b D –D 0xd0xxxxx + +执行完命令后重启DevEco Studio。 + +## 应用如何打印日志是使用hilog还是console,hilog接口参数domain的设置范围是什么? + +适用于:OpenHarmony SDK 3.2.2.5版本 + +推荐使用[hilog日志系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-hilog.md)进行日志打印,接口参数domain的设置范围可以参考[开发指南](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-hilog.md#hilogisloggable)。 + +## hilog日志打印长度限制是多少,是否可以配置 + +适用于:OpenHarmony SDK 3.2.2.5版本 + +日志打印的长度限制为1024,该长度不能配置。 + +## 为什么有时候直接用IDE安装HAP包到开发板上无法打开? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +请检查sdk和开发板烧录的系统版本是否一致,推荐取同一天的sdk和系统版本。 + +## 如何通过hdc命令上传文件 + +适用于:OpenHarmony SDK 3.2.2.5版本 + +可以使用hdc_std file send上传文件。 + +## 如何让RK3568开发板不熄屏? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +输入命令hdc_std shell "power-shell setmode 602" + +## 如何通过命令启动Ability? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +输入命令hdc_std shell aa start -a AbilityName -b bundleName -m moduleName diff --git a/zh-cn/application-dev/faqs/faqs-ide.md b/zh-cn/application-dev/faqs/faqs-ide.md new file mode 100644 index 0000000000..c9b32df075 --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-ide.md @@ -0,0 +1,19 @@ +# IDE使用常见问题 + + + +## 如何解决报错“npm ERR! code SELF_SIGNED_CERT_IN_CHAIN”? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +1. 在Dev Eco Studio terminal中执行npm config set strict-ssl=false; + +2. 在Dev Eco Studio terminal中执行npm install。 + +## 手工更新DevEco的SDK后,编译HAP报错“Cannot find module 'xxx\ets\x.x.x.x\build-tools\ets-loader\node_modules\webpack\bin\webpack.js'” + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +1. 到SDK的ets\x.x.x.x\build-tools\ets-loader目录下执行npm install; + +2. 到SDK的js\x.x.x.x\build-tools\ace-loader目录下执行npm install。 完成步骤后重新编辑既可。 diff --git a/zh-cn/application-dev/faqs/faqs-native.md b/zh-cn/application-dev/faqs/faqs-native.md new file mode 100644 index 0000000000..cbf66a518d --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-native.md @@ -0,0 +1,57 @@ +# Native API使用常见问题 + + + +## 运行Native HAP的时候,导入的命名空间报错Obj is not a valid object + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +检查模块根目录(注意不是工程根目录)下的build-profile.json5文件,如果设备是32位,需要在abiFilters参数中配置armeabi-v7a,如果设备是64位,需要在abiFilters参数中配置arm64-v8a。 + +## NAPI开发的C++代码中,如何获取到模块 package.json 文件中的 “version” 值? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +1. 在编译工具Hvigor脚本文件hvigorfile.js中,通过subModule.getPackageJsonPath方法获取module中package.json文件位置; + +2. 使用nodejs能力读取package.json文件中version字段,写入build-profile.json5文件buildOption.cppFlags字段; + +示例: + + +``` +// module hvigorfile.js +const subModule = require('@ohos/hvigor')(__filename) + +const fs = require("fs-extra") +const path = require("path") + +const packageJsonPath = subModule.getPackageJsonPath() +const buildProfilePath = path.resolve(packageJsonPath, '../build-profile.json5') +const packageJsonData = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) +let buildProfileData = fs.readFileSync(buildProfilePath, 'utf8') +buildProfileData = buildProfileData.replace(/\"cppFlags\"\:(.*)\,/, `"cppFlags": "-D NWEBEX_VERSION=${packageJsonData.version}",`) +fs.writeFileSync(buildProfilePath, buildProfileData, 'utf8') + +const ohosPlugin = require('@ohos/hvigor-ohos-plugin').hapTasks(subModule) // 该插件执行了C++编译任务,读取了build-profile.json5文件 + +module.exports = { + ohos: ohosPlugin +} +``` + + +``` +// hellp.cpp 读取 +#define _NWEBEX_VERSION(v) #v +#define _NWEBEX_VER2STR(v) _NWEBEX_VERSION(v) + +static napi_value Add(napi_env env, napi_callback_info info) +{ + + napi_value fixed_version_value = nullptr; + napi_create_string_utf8(env, _NWEBEX_VER2STR(NWEBEX_VERSION), NAPI_AUTO_LENGTH, &fixed_version_value); + + return fixed_version_value; +} +``` diff --git a/zh-cn/application-dev/faqs/faqs-third-party-library.md b/zh-cn/application-dev/faqs/faqs-third-party-library.md new file mode 100644 index 0000000000..758305d4ac --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-third-party-library.md @@ -0,0 +1,9 @@ +# 三四方库使用常见问题 + + + +## 报错“Stage model module … does not support including OpenHarmony npm packages or modules in FA model. OpenHarmony build tasks will not be executed, and OpenHarmony resources will not be packed. ”是什么意思? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +三四方件未适配API9 Stage模型,无法使用。 diff --git a/zh-cn/application-dev/faqs/faqs-ui-ets.md b/zh-cn/application-dev/faqs/faqs-ui-ets.md new file mode 100644 index 0000000000..cd53f334c0 --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-ui-ets.md @@ -0,0 +1,282 @@ +# UI框架(eTS)开发常见问题 + + + +## TS语言在生成器函数中编译失败,有哪些使用限制? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +TS语言的使用在生成器函数中存在以下限制: + +- 表达式仅允许在字符串(${expression})、if条件、ForEach的参数和组件的参数中使用; + +- 这些表达式中的任何一个都不能导致任何应用程序状态变量(\@State、\@Link、\@Prop)的改变,否则会导致未定义和潜在不稳定的框架行为; + +- 生成器函数内部不能有局部变量。 + +上述限制都不适用于事件处理函数(例如onClick)的匿名函数实现。 + +错误示例: + + +``` +build() { + let a: number = 1 // invalid: variable declaration not allowed + Column() { + Text('Hello ${this.myName.toUpperCase()}') // ok. + ForEach(this.arr.reverse(), ..., ...) // invalid: Array.reverse modifies the @State array varible in place + } + buildSpecial() // invalid: no function calls + Text(this.calcTextValue()) // this function call is ok. +} +``` + +## 在Stage模型下,如何通过router实现页面跳转 + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +1. 对于通过页面路由router实现页面跳转,首先要在main_pages.json配置文件中将所有跳转的页面加入pages列表; + +2. 页面路由需要在页面渲染完成之后才能调用,在onInit和onReady生命周期中页面还处于渲染阶段,禁止调用页面路由方法。 + +## router通过调用push方法进堆栈的page是否会被回收 + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +调用push进入堆栈的page不回收,调用back方法出栈后可以被回收。 + +## 如何动态替换掉资源文件中的“%s”占位符 + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +在应用中,通过"$r('app.string.xx')"的形式引用应用资源,$r的第二个参数可用于替换%s占位符。 + + 示例: + +``` +build() { + //do something + //引用的string资源,$r的第二个参数用于替换%s + Text($r('app.string.entry_desc','aaa')) + .fontSize(100) + .fontColor(Color.Black) + //do something +} +``` + +## 如何读取Resource中的xml文件并转化为String类型 + +适用于:OpenHarmony SDK 3.2.2.5版本, API9 Stage模型 + +1. 通过resourceManager的RawFile接口获取Uint8Array格式数据。 + +2. 通过String.fromCharCode将Uint8Array格式数据转化为String类型。 + +参考文档:[资源管理](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-resource-manager.md) + +示例: + + +``` +resourceManager.getRawFile(path, (error, value) => { + if (error != null) { + console.log("error is " + error); + } else { + let rawFile = value; + let xml = String.fromCharCode.apply(null, rawFile) + } +}); +``` + +## 如何将Resource资源对象转成string类型 + +适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 + +通过\@ohos.resourceManager模块 resourceManager.getString()方法获取字符串。 + +参考文档:[资源管理](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-resource-manager.md#getstring) + +## class全局静态变量无法使用的问题 + +适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 + +Page和Ability打包后会对import的对象分别形成两个不同的闭包,即打包出两个Global对象。因此,所引用的静态变量并不是同一对象,所以无法通过class静态变量方式定义全局变量。建议使用AppStorage进行全局变量管理。 + +参考文档:[应用程序的数据存储](https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/ui/ts-application-states-appstorage.md/) + +## Stage模型下如何获取资源 + +适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 + +Stage模型支持了通过context获取resourceManager对象的方式,再调用其内部获取资源的接口,无需再导入包,此方式FA模型不适用。 + +示例: + + +``` +const context = getContext(this) as any +context + .resourceManager + .getString($r('app.string.entry_desc').id) + .then(value => { + this.message = value.toString() +}) +``` + +## 如何将容器定位到屏幕的最底部? + +适用于:OpenHarmony SDK 3.2.3.5版本, API9 Stage模型 + +可以使用Stack堆叠容器,设置子组件在容器内的最底部。 + + 示例: + +``` +build() { + Stack({alignContent : Alignment.Bottom}) { + //容器位于最底部 + Stack() { + Column() + .width('100%') + .height('100%') + .backgroundColor(Color.Yellow) + } + .width('100%') + .height('10%') + } + .width('100%') + .height('100%') + .backgroundColor('rgba(255,255,255, 0)') +} +``` + +## CustomDialog是否支持在TS文件中使用? + +适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型 + +不支持,CustomDialog当前只支持在eTS的Page中使用。 + +参考文档:[自定义弹窗](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md) + +## 如何将CustomDialog中的变量传递给Page页面中的变量? + +适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型 + +利用自定义的回调函数,当点击弹窗的confirm按钮时,将data数据从自定义弹窗组件中传递给当前的page的页面。 + +示例: + + +``` +// CustomDialog 组件 +@CustomDialog +struct MyDialog { + controller: CustomDialogController + title: string + data: string + cancel: () => void + confirm: (data: string) => void + Button('confirm') + .onClick(() => { + this.controller.close() + this.data = 'test' + this.confirm(this.data) + }).backgroundColor(0xffffff).fontColor(Color.Red) +// Page页面 +@Entry +@Component +struct DialogTest { + dialogController: CustomDialogController = new CustomDialogController({ + builder: MyDialog({ title:'标题自定义',cancel: this.onCancel, + confirm: this.onAccept.bind(this) }), // 绑定自定义的回调函数 + cancel: this.existApp, + autoCancel: true + }) + onAccept(data:string) { + console.info('Callback when the second button is clicked ' + data) + } +} +``` + +## List组件上添加了Text组件后,List组件无法拖动到底部 + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +在List的父容器加上代码layoutWeight(1)。原理:List属于可滚动容器组件,默认高度是占满全屏幕高度,当出现其他固定高度的组件占领了屏幕的部分高度时,需要开发人员显性的指定List组件占满剩余高度,而不是全屏幕高度。 + +## 栅格布局子组件如何居中? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +GridContainer内子组件默认水平左对齐,居中显示可以参考以下处理方式: + +内部嵌套布局组件Row,设置Row属性justifyContent(FlexAlign.Center),内部嵌套子组件可保持居中显示,参考[栅格布局](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/ui-ts-layout-grid-container.md)文档。 + + 示例: + +``` +GridContainer({ sizeType: SizeType.SM, columns: 12 }) { + Row() { + Text('1') + .useSizeType({ + sm: { span: 4, offset: 0 }, + }) + .backgroundColor(0x46F2B4) + }.justifyContent(FlexAlign.Center) // 该属性设置使子组件居中显示 +} +``` + +## 如何获取状态栏和导航栏高度? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +在加载窗口内容之前,采用systemAvoidAreaChange事件监听。 + + 示例: + +``` +// MainAbility.ts +import window from '@ohos.window'; + +/** + * 设置沉浸式窗口,并获取状态栏和导航栏高度 + * @param mainWindow 主窗口对象 + */ +async function enterImmersion(mainWindow: window.Window) { + mainWindow.on("systemAvoidAreaChange", (area: window.AvoidArea) => { + AppStorage.SetOrCreate("topHeight", area.topRect.height); + AppStorage.SetOrCreate("bottomHeight", area.bottomRect.height); + }) + await mainWindow.setFullScreen(true) + await mainWindow.setSystemBarEnable(["status", "navigation"]) + await mainWindow.setSystemBarProperties({ + navigationBarColor: "#00000000", + statusBarColor: "#00000000", + navigationBarContentColor: "#FF0000", + statusBarContentColor: "#FF0000" + }) +} +export default class MainAbility extends Ability { + // do something + async onWindowStageCreate(windowStage: window.WindowStage) { + let mainWindow = await windowStage.getMainWindow() + await enterImmersion(mainWindow) + windowStage.loadContent('pages/index') + } + // do something +} +``` + +## 如何在eTS代码中执行Web组件内的JS函数? + +适用于:OpenHarmony SDK 3.2.3.5版本, API9 Stage模型 + +通过WebController中runJavaScript方法异步执行JavaScript脚本,并通过回调方式返回脚本执行的结果。注意:runJavaScript需要在loadUrl完成后,比如onPageEnd中调用。 + +参考文档:[Web](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-web.md) + +## 在容器组件嵌套的场景下,如何解决手势拖拽事件出现错乱的问题? + +适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 + +gesture的属性distance默认值是5,把gesture的属性distance设成1就可以解决。 diff --git a/zh-cn/application-dev/faqs/faqs-ui-js.md b/zh-cn/application-dev/faqs/faqs-ui-js.md new file mode 100644 index 0000000000..390b9e3753 --- /dev/null +++ b/zh-cn/application-dev/faqs/faqs-ui-js.md @@ -0,0 +1,96 @@ +# UI框架(JS)开发常见问题 + + + +## 如何取出xml文件中对应的字段 + +适用于:OpenHarmony SDK 3.2.3.5版本, API9 Stage模型 + +convertxml中convert方法提供了转换xml文本为JavaScript对象的能力。 + +示例: + + +``` +import convertxml from '@ohos.convertxml'; +// 代码片段 +xml = + '' + + '' + + ' Happy' + + ' Work' + + ' Play' + + ''; +let conv = new convertxml.ConvertXML(); +// 转换选项, 参考文档使用 +let options = {trim : false, declarationKey:"_declaration", + instructionKey : "_instruction", attributesKey : "_attributes", + textKey : "_text", cdataKey:"_cdata", doctypeKey : "_doctype", + commentKey : "_comment", parentKey : "_parent", typeKey : "_type", + nameKey : "_name", elementsKey : "_elements"} +let result:any = conv.convert(xml, options) // 将xml文本转为JS对象 +console.log('Test: ' + JSON.stringify(result)) +console.log('Test: ' + result._declaration._attributes.version) // xml代码片段version字段信息 +console.log('Test: ' + result._elements[0]._elements[0]._elements[0]._text) // xml代码片段title字段内容 +``` + +参考文档:[xml转换JavaScript](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-convertxml.md) + +## JS、TS和eTS的区别 + +适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 + +- JS:Web 的编程语言。具有轻量级,弱类型等特点。 + +- TS:TS是JS的超集,拓展了JS的语法。有明确的类型与更多面向对象的内容如接口,枚举等。 + +- eTS:OpenHarmony UI开发框架语言,是对TS的扩展,通过声明式开发范式实现UI界面。 + +## 如何将时间转为时分秒格式 + +示例: + + +``` +export default class DateTimeUtil{ + /** + * 时分秒 + */ + getTime() { + const DATETIME = new Date() + return this.concatTime(DATETIME.getHours(),DATETIME.getMinutes(),DATETIME.getSeconds()) + } + /** + * 年月日 + */ + getDate() { + const DATETIME = new Date() + return this.concatDate(DATETIME.getFullYear(),DATETIME.getMonth()+1,DATETIME.getDate()) + } + /** + * 日期不足两位补充0 + * @param value-数据值 + */ + fill(value:number) { + return (value> 9 ? '' : '0') + value + } + /** + * 年月日格式修饰 + * @param year + * @param month + * @param date + */ + concatDate(year: number, month: number, date: number){ + return `${year}${this.fill(month)}${this.fill(date)}` + } + /** + * 时分秒格式修饰 + * @param hours + * @param minutes + * @param seconds + */ + concatTime(hours:number,minutes:number,seconds:number){ + return `${this.fill(hours)}${this.fill(minutes)}${this.fill(seconds)}` + } +} +``` diff --git a/zh-cn/application-dev/faqs/figures/zh-cn_image_0000001361254285.png b/zh-cn/application-dev/faqs/figures/zh-cn_image_0000001361254285.png new file mode 100644 index 0000000000000000000000000000000000000000..bbce36c81db4c07075a8f91075842b6f33f35b34 GIT binary patch literal 20550 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 literal 0 HcmV?d00001 -- GitLab