为什么将重力应用于相对布局时不起作用?
为什么将重力应用于相对布局时不起作用?
我已经知道如果我在文本视图上使用layout_gravity="center_horizontal"
,那么文本将居中显示。但是我不想使用这个,因为我希望尽可能少地使用代码,最好的方法是将gravity="center_horizontal"
应用于我的相对布局。我提出这个问题也是因为我担心在相对布局中使用gravity
或layout_gravity
。当我进行研究时,我看到了这个回答:this。
请注意,其中有一部分说:
不要在RelativeLayout中使用gravity/layout_gravity。将它们用于LinearLayouts和FrameLayouts中的视图。
尽管从相对布局的Android文档中,很明显地列出了gravity
作为一个有效的属性,这清楚地说明了Google打算将这些属性用于相对布局。
如果那句话是正确的,那么我如何在相对布局中居中视图?
此外,这是我的代码:
请注意标题不是水平居中的
相对布局和文本视图一直是我遇到的问题。我认为这是因为文本视图动态计算其大小,这会阻止其与布局的对齐方式正常工作。这只是我的一个推测。
我通常采用的解决方法是将文本视图的水平大小配置为match_parent。这可能不是最优解,但应该可以正常工作。如果你需要一个固定大小的文本视图,可以设置一个固定大小的尺寸,也应该可以正常工作,只有wrap_content会有问题。
编辑:
如 S. 建议的添加
android:layout_centerHorizontal="true"
wrap_content 也应该可以正常工作。原因在于我的理解仍然是相同的:文本视图的大小是稍后计算的。
嘿,感谢你的答案,但是我修改了我的代码,因为我添加的简化代码实际上是可以工作的。当我将AutoCompleteTextView作为相对布局的子项时,代码的对齐方式会混乱。对此你有什么想法吗?
哈哈,真的吗...无论如何,将其作为另一种选择方式,如果不是解决方案的话。
相对布局(RelativeLayout)中的重力属性(gravity)不起作用的原因是,当将AutoCompleteTextView作为RelativeLayout的子元素时,重力设置失效。而将TextView作为子元素时,重力设置生效。
解决方法是将AutoCompleteTextView的android:layout_width属性设置为wrap_content,这样重力设置才会生效。这个问题是AutoCompleteTextView特有的问题,其他组件不会出现这个问题。
总结一下,相对布局中的重力属性只对TextView有效,对于其他组件如按钮或开关等则不起作用。而对于AutoCompleteTextView组件,只有在将android:layout_width属性设置为wrap_content时,重力设置才会生效。
需要注意的是,无论是哪个组件,只有宽度最宽的组件会决定其他组件的位置。
以上就是相对布局中重力属性失效的原因和解决方法。
相对布局中为什么重力(gravity)不起作用的原因是因为相对布局(RelativeLayout)的子视图中的layout_gravity属性没有效果。而解决方法是使用LinearLayout代替RelativeLayout,并设置gravity属性来实现相同的效果。
在原始答案中指出,gravity和layout_gravity属性适用于ViewGroup(特别是LinearLayout)中的子视图,而不适用于ViewGroup本身。然而,RelativeLayout确实可以设置gravity和layout_gravity属性。layout_gravity属性会影响RelativeLayout在其父视图中的位置,所以在这里不涉及这方面的内容。然而,gravity属性会影响子视图的位置,如下图所示。
可以看到,gravity属性有效,但layout_gravity属性无效。
当将gravity属性添加到LinearLayout中时,它会按照预期排列子视图。例如,可以通过将LinearLayout的gravity设置为center_horizontal来减少代码量,而无需为每个子视图单独设置layout_gravity属性。以下是图像中的不同选项。
可以看到,当视图使用layout_gravity属性时,它会覆盖LinearLayout的gravity属性。
当在RelativeLayout中定位视图时,通常的做法是为每个视图添加以下属性:
- layout_alignParentTop
- layout_centerVertical
- layout_below
- layout_toRightOf
如果想一次设置所有视图,可能更适合使用LinearLayout(或者可能使用Style)。
总结一下:
- layout_gravity属性对RelativeLayout中的子视图不起作用。
- RelativeLayout的gravity属性起作用,但不像预期的那样。
补充XML:
"View gravity and layout_gravity inside a Relative Layout"的XML代码:
"Relative Layout with gravity"的XML代码:
"Linear Layout with gravity"的XML代码: