HarmonyOS 鸿蒙Next 自定义导航栏布局问题

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

HarmonyOS 鸿蒙Next 自定义导航栏布局问题

导航栏分割成 左边按钮 中间标题 右边按钮,其中 左边、右边按钮 可能会有多个点情况,左边至少会有一个返回按钮,右边可能会没有,请问一下,这样的布局要如何编写 例如: build() { Row() { // 左边view,可能会有多个按钮,至少会有一个按钮 Row(){ Button(“左边 Btn1”) Button(“左边 Btn2”) }  // 这个标题相对父组件需要始终居中,并且当右侧View 没有数据时,需要顶到右侧边界 // 如果标题过长时,不能超出,需要显示  xxxx… 等样式 Text(“标题…”) .textAlign(TextAlign.Center) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(1)  // 右边view,根据数据渲染,有可能右边不存在view Row(){ Text(“右边View1”) Text(“右边View2”) }  }.justifyContent(FlexAlign.SpaceBetween) }


更多关于HarmonyOS 鸿蒙Next 自定义导航栏布局问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

参考下面的demo:

@Entry

@Component

struct Index {

  @State message: string = '标题长度测试标题长度测试标题长度测试标题长度测试标题长度测试';

  @State isShow:Boolean = false

  aboutToAppear() {

  }

  build() {

   Column(){

     Flex({alignItems:ItemAlign.Center}) {

       Button('返回')

         .margin({right:5})

         .width('80')

       Text(this.message)

         .flexGrow(1)

         .border({width:1,color:'#000'})

         .height('100%')

         .textOverflow({ overflow: TextOverflow.Ellipsis })

         .maxLines(1)

         .margin({left:10})

       if(this.isShow) {

         Button('右侧')

           .width('80')

       }

     }

     .width('100%')

     .height('10%')

     .backgroundColor('#ff518d3a')

     Button('右侧按钮显示隐藏')

       .onClick(()=> {

         this.isShow = !this.isShow

       })

       .margin({top:10})

   }

   .width('100%')

    .height('100%')

  }

}

多个按钮会存在宽度不够的情况,您可以使用一个更多按钮的操作,弹出一个弹框,将其他按钮在弹框中展示

@CustomDialog

struct CustomDialogExample {

  @Link textValue: string

  @Link inputValue: string

  controller?: CustomDialogController

  // 若尝试在CustomDialog中传入多个其他的Controller,以实现在CustomDialog中打开另一个或另一些CustomDialog,那么此处需要将指向自己的controller放在所有controller的后面

  cancel: () => void = () => {

  }

  confirm: () => void = () => {

  }

  build() {

    Column() {

      Flex({ justifyContent: FlexAlign.SpaceAround }) {

        Button('cancel')

          .onClick(() => {

            if (this.controller != undefined) {

              this.controller.close()

              this.cancel()

            }

          }).backgroundColor(0xffffff).fontColor(Color.Black)

        Button('confirm')

          .onClick(() => {

            if (this.controller != undefined) {

              this.inputValue = this.textValue

              this.controller.close()

              this.confirm()

            }

          }).backgroundColor(0xffffff).fontColor(Color.Red)

      }.margin({ bottom: 10 })

      Row() {

        Button('按钮一')

        Button('按钮二')

        Button('按钮二')

      }

    }

    .height(200)

    .borderRadius(10)

    // 如果需要使用border属性或cornerRadius属性,请和borderRadius属性一起使用。

  }

}

@Entry

@Component

struct FlexExample {

  @State textValue: string = ''

  @State inputValue: string = '更多'

  @State message: string = '标题长度测试标题长度测试标题长度测试标题长度测试标题长度测试';

  @State isShow: Boolean = false

  dialogController: CustomDialogController | null = new CustomDialogController({

    builder: CustomDialogExample({

      cancel: ()=> { this.onCancel() },

      confirm: ()=> { this.onAccept() },

      textValue: $textValue,

      inputValue: $inputValue

    }),

    cancel: this.exitApp,

    autoCancel: true,

    alignment: DialogAlignment.Bottom,

    offset: { dx: 0, dy: -20 },

    gridCount: 4,

    customStyle: false,

    cornerRadius: 10,

  })

  // 在自定义组件即将析构销毁时将dialogControlle置空

  aboutToDisappear() {

    this.dialogController = null // 将dialogController置空

  }

  onCancel() {

    console.info('Callback when the first button is clicked')

  }

  onAccept() {

    console.info('Callback when the second button is clicked')

  }

  exitApp() {

    console.info('Click the callback in the blank area')

  }

  build() {

    Column({ space: 5 }) {

      Flex({alignItems:ItemAlign.Center,}) {

        Button('左侧按钮')

          .flexBasis(150)

          .fontSize(15)

          .backgroundColor(0xF5DEB3)

      Row(){

       Flex({alignItems:ItemAlign.Center,}) {

         Text(this.message)

           .textAlign(TextAlign.Center)

           .flexGrow(1)

           .height(100)

           .textOverflow({ overflow: TextOverflow.Ellipsis })

           .maxLines(1)

           .backgroundColor(0xD2B48C)

         if(this.isShow) {

           Button('右侧按钮')

             .flexBasis(150)

             .fontSize(14)

             .onClick(()=> {

               if (this.dialogController != null) {

                 this.dialogController.open()

               }

             })

         }

       }

      }

      .flexBasis('auto')

      .flexGrow(1)

      .height(100)

      .backgroundColor(0xD2B48C)

      }.width('95%').height(120).backgroundColor(0xAFEEEE)

      Button('显示')

        .onClick(()=> {

          this.isShow =!this.isShow

        })

    }.width('100%').margin({ top: 5,right:5 })

  }

}

更多关于HarmonyOS 鸿蒙Next 自定义导航栏布局问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


估计要判断判断文字长度来布局了。

因为文字顶到右边和居中,这两个是互斥的

在HarmonyOS鸿蒙Next系统中,自定义导航栏布局通常涉及修改系统UI组件的显示与行为。要实现这一点,你需要利用鸿蒙提供的UI框架和相关API。

  1. 资源文件配置:首先,在项目的资源文件中(如config.json或对应的UI配置文件),确保已正确声明和配置导航栏的相关属性,如是否显示、位置、透明度等。

  2. 自定义组件:如果需要完全自定义导航栏的布局,可以通过创建自定义组件来实现。在自定义组件中,你可以使用鸿蒙提供的布局和控件API,如DirectionalLayoutStackLayout等,来构建所需的导航栏布局。

  3. 设置系统属性:在代码中,通过调用系统API来设置导航栏的显示和隐藏状态,以及可能的动画效果。鸿蒙系统提供了相应的API接口来支持这些操作。

  4. 事件处理:为自定义导航栏中的控件添加事件监听器,处理用户交互,如点击、滑动等。

请注意,由于鸿蒙系统的更新和版本差异,具体的API和配置方式可能会有所不同。因此,建议参考最新的鸿蒙开发者文档来获取最准确的信息。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部