HarmonyOS 鸿蒙Next RelativeContainer布局,约束问题-组件不展示?
HarmonyOS 鸿蒙Next RelativeContainer布局,约束问题-组件不展示? 代码如下 :
想要实现的效果如图:约束【发布按钮】与左侧的【Text组件】是垂直居中的
在AlignDisStockReleaseButton变量中添加如下代码,即底部与左侧Text组件底部对齐,
但是会导致所有组件都不显示,请问是什么原因导致的?
@Entry
@Component
struct SnapshotExample {
build() {
RelativeContainer() {
TextInput({ placeholder: '股林论股,畅所欲言~', text: '股林论股,畅所欲言~' })
.id('disStockTextInput')
.alignRules(AlignDisStockTextInput)
.constraintSize({ maxWidth: '100%' })
.margin({ top: 10, left: 16 })
.fontSize(15)
.fontColor($r('app.color.text_black_lv1'))
Button('发布')
.width(64)
.height(30)
.id('disStockReleaseButton')
.alignRules(AlignDisStockReleaseButton)
Row({ space: 10 }) {
Text() {
ImageSpan($r("app.media.publish_photo_icon")).width(16).aspectRatio(1)
Span(' 图片').fontSize(14).fontColor($r('app.color.text_black_lv3'))
}
Text() {
ImageSpan($r('app.media.publish_huati_icon')).width(16).aspectRatio(1)
Span(' 话题').fontSize(14).fontColor($r('app.color.text_black_lv3'))
}
Text() {
ImageSpan($r('app.media.publish_gupiao_icon')).width(16).aspectRatio(1)
Span(' 股票').fontSize(14).fontColor($r('app.color.text_black_lv3'))
}
Text() {
ImageSpan($r('app.media.publish_lianjie_icon')).width(16).aspectRatio(1)
Span(' 链接').fontSize(14).fontColor($r('app.color.text_black_lv3'))
}
}
.id('disStockRowRouter')
.alignRules(AlignDisStockRowRouter)
.margin({ left: 16 })
Row() {
Text('0/450')
}
.id('disTextNumLimit')
.alignRules(AlignDisTextNumLimit)
}
.width('100%')
.height(100)
.backgroundColor('#c0c0c0')
}
}
let AlignDisStockTextInput: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
'top': { 'anchor': '__container__', 'align': VerticalAlign.Top },
'left': { 'anchor': '__container__', 'align': HorizontalAlign.Start },
'right': { 'anchor': 'disStockReleaseButton', 'align': HorizontalAlign.Start }
}
let AlignDisStockReleaseButton: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
'top': { 'anchor': '__container__', 'align': VerticalAlign.Top },
'right': { 'anchor': '__container__', 'align': HorizontalAlign.End }
}
let AlignDisStockRowRouter: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Bottom },
'bottom': { 'anchor': "__container__", 'align': VerticalAlign.Bottom },
'left': { 'anchor': '__container__', 'align': HorizontalAlign.Start }
}
let AlignDisTextNumLimit: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Bottom },
'bottom': { 'anchor': "__container__", 'align': VerticalAlign.Bottom },
'right': { 'anchor': '__container__', 'align': HorizontalAlign.End }
}
更多关于HarmonyOS 鸿蒙Next RelativeContainer布局,约束问题-组件不展示?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这种解决办法不是很好,因为把按钮的宽高写死了,更好的话,我觉得可以换成Row布局
@Entry
@Component
struct SnapshotExample {
build() {
RelativeContainer() {
TextInput({ placeholder: '股林论股,畅所欲言~', text: '股林论股,畅所欲言~' })
.id('disStockTextInput')
.alignRules(AlignDisStockTextInput)
.margin({ top: 10, left: 16, right: 96 })
.fontSize(15)
.fontColor($r('app.color.text_black_lv1'))
Button('发布')
.width(64)
.height(30)
.margin({ left: 16 })
.id('disStockReleaseButton')
.alignRules(AlignDisStockReleaseButton)
Row({ space: 10 }) {
Text() {
ImageSpan($r("app.media.publish_photo_icon")).width(16).aspectRatio(1)
Span(' 图片').fontSize(14).fontColor($r('app.color.text_black_lv3'))
}
Text() {
ImageSpan($r('app.media.publish_huati_icon')).width(16).aspectRatio(1)
Span(' 话题').fontSize(14).fontColor($r('app.color.text_black_lv3'))
}
Text() {
ImageSpan($r('app.media.publish_gupiao_icon')).width(16).aspectRatio(1)
Span(' 股票').fontSize(14).fontColor($r('app.color.text_black_lv3'))
}
Text() {
ImageSpan($r('app.media.publish_lianjie_icon')).width(16).aspectRatio(1)
Span(' 链接').fontSize(14).fontColor($r('app.color.text_black_lv3'))
}
}
.id('disStockRowRouter')
.alignRules(AlignDisStockRowRouter)
.margin({ left: 16 })
Row() {
Text('0/450')
}
.id('disTextNumLimit')
.alignRules(AlignDisTextNumLimit)
}
.width('100%')
.height(100)
.backgroundColor('#c0c0c0')
}
}
let AlignDisStockTextInput: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
'top': { 'anchor': '__container__', 'align': VerticalAlign.Top },
'left': { 'anchor': '__container__', 'align': HorizontalAlign.Start },
}
let AlignDisStockReleaseButton: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Top },
'bottom': { 'anchor': "disStockTextInput", 'align': VerticalAlign.Bottom },
'left': { 'anchor': 'disStockTextInput', 'align': HorizontalAlign.End }
}
let AlignDisStockRowRouter: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Bottom },
'bottom': { 'anchor': "__container__", 'align': VerticalAlign.Bottom },
'left': { 'anchor': '__container__', 'align': HorizontalAlign.Start }
}
let AlignDisTextNumLimit: Record<string, Record<string, string | VerticalAlign | HorizontalAlign>> = {
'top': { 'anchor': 'disStockTextInput', 'align': VerticalAlign.Bottom },
'bottom': { 'anchor': "__container__", 'align': VerticalAlign.Bottom },
'right': { 'anchor': '__container__', 'align': HorizontalAlign.End }
}
更多关于HarmonyOS 鸿蒙Next RelativeContainer布局,约束问题-组件不展示?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
非常感谢一位群友给的提示:
尝试注释掉一半子组件 二分查找法 判断出问题的点
是因为两个不固定尺寸的子组件 互相约束
解决办法是把AlignDisStockTextInput中的 ‘right’: { ‘anchor’: ‘disStockReleaseButton’, ‘align’: HorizontalAlign.Start }去掉,然后给TextInput组件一个右外边距,再去做按钮的约束,
受教了,
基本信息
姓名: 张三
职位: 软件工程师
技能: Python, Java, C++
经验
2018-2020: 公司A
- 项目1: 描述
- 项目2: 描述
2020-至今: 公司B
- 项目3: 描述
- 项目4: 描述
在HarmonyOS鸿蒙Next中,使用RelativeContainer
布局时,若组件未展示,可能是由于约束条件设置不当导致的。RelativeContainer
允许开发者通过相对定位的方式确定组件的位置,常见的约束属性包括alignRules
、alignParent
、above
、below
、toLeftOf
、toRightOf
等。
首先,确保组件的width
和height
属性已正确设置,未设置或设置为0
时,组件将无法显示。其次,检查alignRules
是否正确配置。alignRules
用于定义组件相对于其他组件或父容器的对齐方式,若未正确定义,组件可能被放置于可视区域之外。
例如,若组件A需要放置在组件B的下方,需在组件A的alignRules
中设置above
属性为组件B的ID。若组件B未正确设置或不存在,组件A将无法正确展示。此外,确保RelativeContainer
的布局参数(如width
和height
)未设置为wrap_content
,这可能导致容器大小不足以容纳组件。
最后,检查组件的visibility
属性,确保其未设置为GONE
。若设置为GONE
,组件将不可见且不占用布局空间。若以上条件均满足,组件仍不展示,建议检查布局层次结构,确保组件未被其他组件覆盖或遮挡。
总结,RelativeContainer
布局中组件不展示的原因通常与约束条件、尺寸设置或可见性相关,需逐一排查并调整相关属性。
在HarmonyOS鸿蒙Next的RelativeContainer布局中,如果组件不展示,可能是以下原因导致的:
-
约束条件未正确设置:RelativeContainer布局依赖于组件间的约束关系,确保每个组件至少设置了
alignRules
属性,指定了与父容器或其他组件的对齐关系。 -
尺寸未定义:如果组件的宽度或高度未明确设置(如
width
或height
为0),组件将无法显示。确保组件设置了合适的尺寸或使用match_parent
/wrap_content
。 -
层级覆盖:检查组件是否被其他组件遮挡或被父容器裁剪(如
clip
属性为true
)。 -
布局未刷新:在动态更新约束后,确保调用
invalidate()
方法刷新布局。
通过检查以上问题,可以解决组件不展示的情况。