当前位置: 首页 > article >正文

【每日学点鸿蒙知识】gbk2313传到native、NAPI打印日志问题、table表格控件、Web 触发新窗口卡住、修饰列表

1、HarmonyOS NAPI调用中,如果从ArkTS传入编码为gbk2313的字符串到Native层,该调用哪个方法?

如果需要从ArkTS传递编码为gbk2313的字符串到Native层,可以使用napi_get_value_string_utf8方法。这个方法允许 获取ArkTS侧传入的字符串到char数组的长度。

2、HarmonyOS NAPI日志不能打印,OH_LOG_INFO和printf都不行?

请参考下面代码

宏定义,可以自己替换
#define LOGI(format, args) OH_LOG_Print(LOG_APP, LOG_INFO, 0, "logI", format, args);

//调用宏 需要在打印参数前加public 数字用d 字符串用s
LOGI("调用宏======%{public}d==================",123);
3、HarmonyOS 有table表格控件吗?

目前没有表格组件,暂时只能使用web组件引入一个本地的html,在html中绘制一个表格。demo如下:

import web_webview from '@ohos.web.webview'

@Entry
@Component
struct TableHtml {
  controller: web_webview.WebviewController = new web_webview.WebviewController();

  build() {
    Column() {
      Button("点击此处,加载HTML富文本").onClick(() => {
        this.controller.loadData(`<html> <head> <style> .table-font-size{ font-size:20px; } </style> </head> <body bgcolor=\"white\"> <table width="1000" border="5" height="1000"> <tr class="table-font-size"> <th>Month</th> <th>Month</th> </tr> <tr class="table-font-size"> <th>Month</th> <th>Month</th> </tr> <tr class="table-font-size"> <th>Month</th> <th>Month</th> </tr> <tr class="table-font-size"> <th>Month</th> <th>Month</th> </tr> </table> </body></html>`, "text/html", "UTF-8");
      }) // 通过$rawfile加载本地资源文件。
      Web({ src: 'www', controller: this.controller }).javaScriptAccess(true).domStorageAccess(true).fileAccess(true)
      // .defaultFontSize(this.fontSize)
    }
  }
}
4、HarmonyOS Web 触发新窗口时卡住?
import webview from '@ohos.web.webview'
import router from '@ohos.router'

@Entry
@Component
struct WebDemo {
  controller = new webview.WebviewController

  getUrl(): string {
    const params = router.getParams() as Record<string, string>
    return params?.url ?? 'https://www.huawei.com/appview/question/56402307?appview=1'
  }

  build() {
    Column() {
      Web({
        src: this.getUrl(),
        controller: this.controller,
      })
        .height('100%')
        .width('100%')
        .multiWindowAccess(true)
        .onWindowNew((e) => {
          console.log('onWindowNew', e.targetUrl)
          router.pushUrl({
            url: 'pages/WebDemo',
            params: {
              url: e.targetUrl,
            },
          })

          //关键代码
          //将新窗口对应WebviewController返回给Web内核。
          //如果不需要打开新窗口请调用event.handler.setWebController接口设置成null。
          //若不调用event.handler.setWebController接口,会造成render进程阻塞。
          e.handler.setWebController(null)
        })
    }
  }
}
5、HarmonyOS 关于@State或@Link 修饰Array的应用?

现有一个数据Bean类型如下:

export class TagBean {
  title: string = ""
  id: string = ""
  is_choose: boolean = false
}

用@State或@Link修饰该Bean的Array数组,如:@Link tagBeans: TagBean[]

目前发现一个问题,在List()中的ForEach(this.tagBeans)内写Text(),背景设置为:.backgroundColor($r(item.is_choose ? “颜色A” : “颜色B”))

在点击事件中使tagBeans[index].is\_choose=true,无法实时更新UI状态

但如果使用额外的string对象去记录点击id,判断(this.chooseIds.indexOf(item.id) >= 0),就可以实现实时更新UI

@ObjectLink和@Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-observed-and-objectlink-V5

demo参考如下

import util from '@ohos.util';

@Observed
class TagBean {
  key: string = util.generateRandomUUID(true);
  name: string;
  is_Choose: boolean;

  constructor(name: string, is_choose: boolean) {
    this.name = name;
    this.is_Choose = is_choose;
  }
}

@Component
struct ViewListItem {
  @ObjectLink tagBean: TagBean;

  build() {
    ListItem() {
      Text(this.tagBean.name)
        .width('100%')
        .height(100)
        .fontSize(16)
        .textAlign(TextAlign.Center)
        .borderRadius(10)
        .backgroundColor(this.tagBean.is_Choose ? Color.White : Color.Red)
    }.onClick(() => {
      this.tagBean.is_Choose = !this.tagBean.is_Choose
    })
  }
}

@Entry
@Component
struct ObservedDemo {
  @State tagBeans: Array<TagBean> = [
    new TagBean('小红1', false),
    new TagBean('小红2', false),
    new TagBean('小红3', false),
    new TagBean('小红4', false),
    new TagBean('小红5', false),
    new TagBean('小红6', false),
    new TagBean('小红7', false),
    new TagBean('小红8', false),
    new TagBean('小红9', false),
  ]

  build() {
    Column() {
      List({ space: 20, initialIndex: 0 }) {
        ForEach(this.tagBeans, (item: TagBean) => {
          ViewListItem({ tagBean: item })
        }, (item: TagBean) => item.key)
      }
      .listDirection(Axis.Vertical)
      .friction(0.6)
      .divider({
        strokeWidth: 2,
        color: 0xFFFFFF,
        startMargin: 20,
        endMargin: 20
      })
      .edgeEffect(EdgeEffect.Spring)
      .width('90%')
    }
    .backgroundColor(Color.Black)
    .width('100%')
    .height('100%')
  }
}

http://www.kler.cn/a/463956.html

相关文章:

  • C/C++在鸿蒙系统中主要用于硬件开发和系统级编程
  • Spring Boot 3 实现 MySQL 主从数据库之间的数据同步
  • 【Pytorch报错】AttributeError: cannot assign module before Module.__init__() call
  • 呼叫中心中间件实现IVR进入排队,判断排队超时播放提示音
  • JavaScript系列(4)--数值类型专题
  • Linux Red Hat 7.9 Server安装GitLab
  • 云计算与服务是什么
  • 模电面试——设计题及综合分析题0x01(含答案)
  • 深入剖析Android SoundPool及其JNI实现
  • python爬虫——爬取全年天气数据并做可视化分析
  • 【机器学习】工业 4.0 下机器学习如何驱动智能制造升级
  • 【C#设计模式(22)——策略模式(Stratege Pattern)】
  • aws(学习笔记第二十课) codecommit以及codedeploy进行开发
  • 如何在群晖NAS上安装并配置MySQL与phpMyAdmin远程管理数据库
  • 金融风控-授信额度模型
  • VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”
  • ruoyi 多租户 开启后针对某一条sql不适用多租户; 若依多租户sql规则修改
  • 如何用CSS3创建圆角矩形并居中显示?
  • 汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%
  • C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码
  • 家谱管理系统|Java|SSM|VUE| 前后端分离
  • 自从学会Git,感觉打开了一扇新大门
  • uniapp生成h5后发布到服务器碰到的问题解决
  • 在基于IMX6ULL的Linux嵌入式编程中,与内存相关的堆(Heap)和栈(Stack)有什么区别?Linux 系统中堆和栈的内存布局是怎么样的?
  • Gin 路由实现原理概述
  • springboot配置并使用RestTemplate