HarmonyOS 鸿蒙Next 我button 按钮 浮在最上层,导致了我下面的刷新组件功能不生效

HarmonyOS 鸿蒙Next 我button 按钮 浮在最上层,导致了我下面的刷新组件功能不生效

基本信息

import { router } from "@kit.ArkUI";

// 定义数据结构
interface TimeAxisData {
  yearMonth: string; // 年月 格式:YYYY-MM
  days: DayItem[];
}

interface DayItem {
  date: string; // 日期
  week: string; // 星期
  tags: string[]; // 标签
  amount: number; // 金额
  shop: string; // 商家
}

@Component
export struct TimeAxis {
  private timeAxisData: TimeAxisData[] = [
    {
      yearMonth: "2025-01",
      days: [
        {
          date: "13",
          week: "一",
          tags: ["#餐饮"],
          amount: 128,
          shop: "星巴克"
        },
        {
          date: "15",
          week: "三",
          tags: ["#交通"],
          amount: 8,
          shop: "公交卡充值"
        }
      ]
    },
  ];
  @State refreshing: boolean = false;
  @State refreshOffset: number = 0;
  @State refreshState: RefreshStatus = RefreshStatus.Inactive;
  @State isLoading: boolean = false;
  @State canLoad: boolean = false;
  @State searchName: string = '';

  @Builder
  search() {
    Row() {
      Row() {
        TextInput({ placeholder: '请根据关键字进行检索...' })
          .enterKeyType(EnterKeyType.Search)
          .width('100%')
          .height(40)
          .margin({ bottom: 10 })
          .onChange((value: string) => {
            this.searchName = value; // 更新搜索关键字
          });
      }
      .padding(10)
      .backgroundColor('#FFFFFF')
      .borderRadius(8)
      .shadow({
        radius: 4,
        color: "#10000000",
        offsetX: 2,
        offsetY: 2
      })
    }
  }

  @Builder
  refreshBuilder() {
    Stack({ alignContent: Alignment.Bottom }) {
      if (this.refreshState != RefreshStatus.Inactive && this.refreshState != RefreshStatus.Done) {
        Progress({ value: this.refreshOffset, total: 64, type: ProgressType.Ring })
          .width(32).height(32)
          .style({ status: this.refreshing ? ProgressStatus.LOADING : ProgressStatus.PROGRESSING })
          .margin(20)
      }
      Text('刷新中').padding({ top: 10 })
    }
    .clip(true)
    .height("100%")
    .width("100%")
  }

  /**
   * 底部
   */
  @Builder
  footer() {
    Row() {
      LoadingProgress().height(32).width(48)
      Text("加载中")
    }.width("100%")
    .height(64)
    .justifyContent(FlexAlign.Center)
    // 当不处于加载中状态时隐藏组件
    .visibility(this.isLoading ? Visibility.Visible : Visibility.Hidden)
  }

  /**
   * 添加
   */
  @Builder
  add() {
    Button('+', { type: ButtonType.Circle, stateEffect: true })
      .backgroundColor(0x317aff)
      .width(56)
      .height(56)
      .hitTestBehavior(HitTestMode.Transparent)
      .position({ x: '75%', y: '85%' })// 精确定位到右下角
      .margin({ right: 16, bottom: 16 })
      .onClick(() => {
        router.pushUrl({ url: 'pages/timeAxis/module/Add' })
      })
  }

  /**
   * 下拉刷新列表
   */
  @Builder
  refresh() {
    Refresh({ refreshing: $$this.refreshing, builder: this.refreshBuilder() }) {
      List({ space: 20 }) {
        ForEach(this.timeAxisData, (group: TimeAxisData) => {
          // 年月分组
          ListItem() {
            Column() {
              // 年月标题
              Text(group.yearMonth)
                .fontSize(20)
                .fontColor("#333")
                .textAlign(TextAlign.Start)
                .margin({ bottom: 12 })

              // 日期列表
              ForEach(group.days, (day: DayItem) => {
                Column() {
                  // 日期行
                  Row() {
                    // 左侧日期区块
                    Column() {
                      Text(day.date)
                        .fontSize(24)
                        .fontColor("#317AFF")
                      Text(day.week)
                        .fontSize(14)
                        .fontColor("#666")
                    }
                    .width("25%")

                    // 右侧内容区块
                    Column() {
                      // 金额和商家
                      Row() {
                        Text(`¥${day.amount.toFixed(2)}`)
                          .fontSize(18)
                          .fontColor("#317AFF")
                        Text(day.shop)
                          .fontSize(16)
                          .fontColor("#333")
                          .margin({ left: 16 })
                      }
                      .justifyContent(FlexAlign.SpaceBetween)

                      // 标签区域
                      Flex({ wrap: FlexWrap.Wrap }) {
                        ForEach(day.tags, (tag: string) => {
                          Text(tag)
                            .fontSize(12)
                            .fontColor("#317AFF")
                            .backgroundColor("#E8F1FF")
                            .borderRadius(12)
                            .padding({
                              left: 8,
                              right: 8,
                              top: 4,
                              bottom: 4
                            })
                            .margin({ right: 8, bottom: 4 })
                        })
                      }
                      .margin({ top: 8 })
                    }
                    .width("75%")
                  }
                  .padding(12)
                  .backgroundColor("#FFFFFF")
                  .borderRadius(8)
                  .shadow({
                    radius: 4,
                    color: "#10000000",
                    offsetX: 2,
                    offsetY: 2
                  })
                }
                .margin({ bottom: 12 })
              })
            }
            .zIndex(10)
            .width("100%")
            .padding(16)
            .backgroundColor("#F5F5F5")
          }
          .onClick(() => {
            let params: string = '111111';
            router.pushUrl({ url: 'pages/timeAxis/module/Details', params: params })
          })
        }, (group: TimeAxisData) => group.yearMonth)
        ListItem() {
          this.footer();
        }
      }
      .width("100%")
      .height("100%")
      .onScrollIndex((start: number, end: number) => {
        if (this.canLoad && end >= this.timeAxisData.length - 1) {
          this.canLoad = false;
          this.isLoading = true;

          setTimeout(() => {
            // 创建新数组
            const newGroups: TimeAxisData[] = [];
            newGroups.push({
              yearMonth: `2025-${this.timeAxisData.length}`, // 保证唯一性
              days: [
                {
                  date: "19",
                  week: "一",
                  tags: ["#通讯"],
                  amount: 98,
                  shop: "话费充值"
                }
              ]
            });

            // 使用concat创建新数组引用
            this.timeAxisData = this.timeAxisData.concat(newGroups);
            this.isLoading = false;
            this.canLoad = true; // 重置加载开关
          }, 700);

        }
      })
      .onScrollFrameBegin((offset: number, state: ScrollState) => {
        // 只有当向上滑动时触发新数据加载
        if (offset > 5 && !this.isLoading) {
          this.canLoad = true;
        }
        return { offsetRemain: offset };
      })
      .scrollBar(BarState.Off)
      // 开启边缘滑动效果
      .edgeEffect(EdgeEffect.Spring, { alwaysEnabled: true })
    }
    .margin({ top: 10 })
    .backgroundColor(0xeeeeee)
    .onOffsetChange((offset: number) => {
      this.refreshOffset = offset;
    })
    .onStateChange((state: RefreshStatus) => {
      this.refreshState = state;
    })
    .onRefreshing(() => {
      // 模拟数据刷新
      setTimeout(() => {
        this.refreshing = false;
      }, 2000)
    })
  }

  build() {
    // 使用Stack作为唯一根组件
    Stack() {
      // 主内容层
      Column() {
        this.search();
        this.refresh();
      }
      .width('100%')
      .height('100%')

      // 悬浮按钮(直接使用Stack布局定位)
      Stack({ alignContent: Alignment.BottomEnd }) {
        this.add()
      }
      .width('100%')
      .height('100%')
      .zIndex(999)
    }
  }
}

更多关于HarmonyOS 鸿蒙Next 我button 按钮 浮在最上层,导致了我下面的刷新组件功能不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

Stack布局也是有层级关系的,你把悬浮按钮放在了最后,并且宽高都是100%,全给页面盖住了,下面的组件肯定相应不了啊!

cke_135.png

cke_6173.png

本身跟组件已经是Stack了,就不需要给悬浮按钮嵌套Stack了啊!

统统注释掉即可!

更多关于HarmonyOS 鸿蒙Next 我button 按钮 浮在最上层,导致了我下面的刷新组件功能不生效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


谢谢回答,使用你的方法已经解决,感谢你的回答,

cke_3022.png

这个组件推荐用

.position({bottom: 0, right: 20})

这样定位 然后把外面的 stack() 删掉

谢谢你的回答,position 使用你这个定位方式,确实要更友好一些,采纳了一楼的回答,已经解决了屏蔽的问题。

这个写的有问题 你这个这样写就相当于给了页面一个遮罩层 那肯定什么都不生效了

是的,按照楼上的回答,已经解决了这个问题。

在HarmonyOS鸿蒙系统中,如果你遇到button按钮浮在最上层导致下面的刷新组件功能不生效的问题,这通常是因为布局层级或组件的堆叠顺序设置不当。

要解决这个问题,你可以检查以下几个方面:

  1. 布局层级:确保button按钮和刷新组件处于正确的布局层级。在鸿蒙的布局文件中,你可以通过调整组件的父容器或使用特定的布局属性来控制组件的堆叠顺序。

  2. 组件的z-index:虽然鸿蒙系统中可能没有直接的“z-index”属性(这取决于你使用的具体布局和组件库),但你可以通过调整组件的添加顺序或在布局文件中使用特定的属性来控制它们的显示层级。通常,后添加的组件会覆盖在先添加的组件之上。

  3. 刷新组件的触发区域:确保刷新组件的触发区域没有被button按钮遮挡。你可以调整button按钮的位置或大小,或者调整刷新组件的触发灵敏度。

如果上述方法仍然无法解决问题,可能是因为你的布局或组件使用方式有特定的限制或问题。此时,你可以考虑查阅鸿蒙系统的官方文档或相关开发资料,以获取更具体的解决方案。

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

回到顶部