HarmonyOS 鸿蒙Next 搜索关键字匹配变化红换行了如何解决

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 搜索关键字匹配变化红换行了如何解决 想给字符串中所有包含搜索关键词的文案都变红

2 回复

参考:

export enum SpanType {
  normal,
  hyperlink,
}
export class CustomSpan {
  public content: string | Resource
  public type: SpanType
  public event: () => void
  constructor(content: string | Resource, type: SpanType = SpanType.normal, event: () => void = () => {
  }) {
    this.content = content
    this.type = type
    this.event = event
  }
  normal(): CustomSpan {
    this.type = SpanType.normal
    return this
  }
  hyperlink(event: () => void): CustomSpan {
    this.type = SpanType.hyperlink
    this.event = event
    return this
  }
}
export class CustomText {
  public static readonly PLACEHOLDER = new RegExp('(%[1-9]{1}[0-9]{0,}\\$s)')
  public spans: Array<CustomSpan>
  constructor(spans: Array<CustomSpan> = []) {
    this.spans = spans
  }
  append(span: CustomSpan): CustomText {
    this.spans.push(span)
    return this
  }
  appendNormal(text: string | Resource): CustomText {
    this.append(new CustomSpan(text).normal())
    return this
  }
  appendHyperlink(text: string | Resource, onClick: () => void): CustomText {
    this.append(new CustomSpan(text).hyperlink(onClick))
    return this
  }
  format(format: string | Resource, args: Array<CustomSpan> = []): CustomText {
    if (!format || !args || args?.length === 0) {
      this.appendNormal(format)
      return this
    }
    if (typeof format === 'string') {
      if (format.length !== 0) {
        this.resolve(format, args)
      }
    } else {
      try {
        let value: string = getContext(this).resourceManager.getStringSync(format)
        if (value && value.length !== 0) {
          this.resolve(value, args)
        }
      } catch (e) {
        console.warn(`CustomText getStringSync: ${JSON.stringify(format)} exception: ${e}`);
      }
    }
    return this
  }
  private resolve(format: string, args: Array<CustomSpan>): CustomText {
    let length: number = args.length
    format.split(CustomText.PLACEHOLDER).forEach((value: string, index: number) => {
      if (!value.match(CustomText.PLACEHOLDER)) {
        this.appendNormal(value)
        return
      }
      let argIndex: number = Number(value.replace('%', '').replace('$s', '')) - 1
      if (argIndex >= length) {
        return
      }
      let span: CustomSpan = args[argIndex++]
      if (span.type === SpanType.normal) {
        this.appendNormal(span.content)
      } else if (span.type === SpanType.hyperlink) {
        this.appendHyperlink(span.content, span.event)
      }
    })
    return this
  }
}
class DeclareDemo {
  format: string | Resource = ''
  args: CustomSpan[] = []
}
@Entry
@Component
struct TextDemoPage {
  urlRegex = /测试一下/g;
  @State declare: DeclareDemo = {
    format: '',
    args: []
  }
  @State textDeclare: Array<CustomText> = []
  aboutToAppear(): void {
    let text: string = '这是一个示例文本测试一下。哈哈哈哈哈哈哈测试一下 哈哈哈哈哈测试一下 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈测试一下哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈 哈哈哈哈哈再测试一下'
    let urls = text.match(this.urlRegex)
    let newText: string = text
    if(urls) {
      let args: CustomSpan[] = []
      urls.forEach((url, idx) => {
        newText = newText.replace(url, `%${idx+1}$s`)
        args.push(new CustomSpan(url).hyperlink(() => {
          console.log('111111111111---url: ', url)
        }),)
      });
      this.declare = {
        format: newText,
        args: args
      }
      this.textDeclare = [new CustomText().format(this.declare.format, this.declare.args)]
      console.log('111 -this.textDeclare: ', JSON.stringify(this.textDeclare))
    }
  }
  build() {
    Row() {
      Column() {
        ForEach(this.textDeclare, (declare: CustomText, index) => {
          Text() {
            ForEach(declare.spans, (span: CustomSpan) => {
              if (span.type == SpanType.normal) {
                Span(span.content)
                  .fontSize(14)
                  .fontColor('#191919')
              } else if (span.type == SpanType.hyperlink) {
                Span(span.content)
                  .fontSize(14)
                  .fontColor(Color.Red)
                  .decoration({type: TextDecorationType.None, color: '#007dff'})
                  .onClick(() => {
                    if (span.event) {
                      span.event()
                    }
                  })
              }
            })
          }
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next 搜索关键字匹配变化红换行了如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对“HarmonyOS 鸿蒙Next 搜索关键字匹配变化红换行了如何解决”的问题,以下提供直接相关的解决方案:

在HarmonyOS鸿蒙Next系统中,若遇到搜索关键字匹配结果出现换行(即显示格式异常)的情况,这通常与系统的文本渲染或界面布局设置有关。为了解决这个问题,可以尝试以下步骤:

  1. 检查系统更新:确保你的HarmonyOS系统已经更新到最新版本,因为新版本可能修复了旧版本中的渲染问题。

  2. 清除缓存:尝试清除应用缓存和系统缓存,有时缓存问题可能导致显示异常。

  3. 重启设备:简单的重启操作有时能解决临时的显示问题。

  4. 检查应用兼容性:如果你是在特定应用中遇到这个问题,检查该应用是否与HarmonyOS鸿蒙Next系统兼容,并尝试更新应用版本。

  5. 调整文本设置:在系统设置中检查字体大小、行间距等文本显示相关设置,确保它们没有异常调整导致显示问题。

如果上述步骤仍然无法解决问题,那么可能需要更深入的系统调试或联系开发者进行适配。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部