Android中AbsoluteLayout的替代方案是什么?

45

如果AbsoluteLayout已被弃用,我该使用什么代替它?

我做了一个使用AbsoluteLayout的应用程序,但它在不同的屏幕分辨率下效果不佳。我使用它是因为我可以设置按钮的X和Y位置。我是否可以使用其他布局来设置按钮的位置?


3
最好描述您想要实现的目标。AbsoluteLayout不再推荐使用的部分原因是它不能很好地支持多个屏幕尺寸。任何与AbsoluteLayout直接相关的布局方式(例如带边距的FrameLayout)都将遇到相同的问题。您应该开始寻找其他解决方案,这些方案可以更好地适用于各种设备。 - CommonsWare
谢谢。我现在添加了一些信息。 - JoeyCK
我刚刚发布了一个库,可能会对原帖作者有所帮助:https://github.com/ManuelPeinado/ImageLayout - Manuel
我喜欢AbsoluteLayout,因为它按照我指定的位置放置元素。我有一个使用按钮的例子,其中一个按钮的宽度是另一个按钮的两倍,但它们最终大小相同,因为某个自以为是的布局认为它知道我想要做什么。 - Paul McCarthy
5个回答

24

3
RelativeLayout存在的一个大问题是,如果你嵌套它们,每一步的OnMeasure调用次数会翻倍。因此,如果你需要一个深层次的层次结构,这并不是一个好的解决方案。 - William Jockusch
@WilliamJockusch 我自己也曾经以同样的艰难方式发现了这个问题。 目前为止最好的解决方案是尽可能使用LinearLayout(通常情况下都可以),并在LinearLayout内嵌套RelativeLayouts。我有一个表视图,我用相对布局和嵌套的RelativeLayouts制作了它 - 只需将顶部视图更改为LinearLayout,就可以获得正常的执行时间。 我猜测,您可以通过创建一个内部包含RelativeLayout的LinearLayout来“hack”“AbsoluteLayout”,但是这种做法听起来很可怕。 - user1122069

12

使用RelativeLayout,并设置左右边距,例如:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
lp.leftMargin = x;
lp.topMargin =  y;

6
考虑使用 FrameLayout。如果将子元素的重力设置为TOP|LEFT,则可以使用leftMargintopMargin作为位置。通过改变重力,还可以获得其他一些有用的定位机制。

1
我建议你们,如果想要完全控制视图在屏幕上的位置,可以扩展ViewGroup并自己实现AbsoluteLayout。最简单的解决方案是使用现有的布局,并调整边距、填充、重力等属性,但是这种控制方式不会那么强大,并且可能会在不同设备屏幕上出现问题。

0
我会使用相对布局,并根据屏幕上的其他项目/边缘进行设置。否则,您的布局在不同设备上显示不同。

1
我正在制作一张图形,在其中必须将文本视图放置在静态图像的确切位置。我认为唯一的方法是(实际上,如果不是技术上)使用绝对布局。然后我可以为各种桶做一个,但现在我预计会很麻烦。 - Geeks On Hugs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接