安卓:绝对布局?

6

我是Android的新手。我喜欢在任何地方自由绘制对象,因此一直在使用绝对布局。但是我收到了一条消息,建议我使用其他布局。我已经了解到这是因为不同手机的分辨率不同。我的问题是,不使用绝对布局的唯一原因是这个吗?我已经编写了一个使用度量衡来调整像素的方法。

public int widthRatio(double ratioIn){
    DisplayMetrics dm = new DisplayMetrics(); //gets screen properties
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    double screenWidth = dm.widthPixels;      //gets screen height
    double ratio = screenWidth/100;           //gets the ratio in terms of %
    int displayWidth = (int)(ratio*ratioIn);  //multiplies ratio desired % of screen 
    return displayWidth;
}

//method to get height or Ypos that is a one size fits all
public int heightRatio(double ratioIn){
    DisplayMetrics dm = new DisplayMetrics(); //gets screen properties
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    double screenHeight = dm.heightPixels;    //gets screen height
    double ratio = screenHeight/100;          //gets the ratio in terms of %
    int newHeight = (int)(ratio*ratioIn);     //multiplies ratio by desired % of screen
    return newHeight;
}

//sets size of any view (button, text, ...) to a one size fits all screens
public void setSizeByRatio(View object, int width, int height){
    LayoutParams params = object.getLayoutParams();
    params.width = widthRatio(width);
    params.height = heightRatio(height);
}

如果我说setSizeByRatio(Button, 10, 25);,它将把按钮的宽度设置为屏幕宽度的10%,高度设置为屏幕高度的25%。

有没有任何手机不支持绝对布局?这种布局是否会引起其他问题?


继续操作并对此进行经验积累,如果出现任何问题,请告诉我们。 - Nikunj Patel
FrameLayout是另一个选项。http://mobile.tutsplus.com/tutorials/android/android-sdk_frame-layout/ - Drew LeSueur
2个回答

6
AbsoluteLayout被弃用的原因是因为你有替代品LinearLayout或GridLayout,它们可以做到同样甚至更多的事情。似乎你正在试图基于绝对位置和像素数量来计算位置,这种方法通常应避免使用,因为会涉及到各种不同屏幕尺寸和密度的问题。
阅读@amiekuser提供的链接,并关注如何理解最佳实践。一些提示包括:为ldpi、mdpi和hdpi文件夹创建图像,使用dpi(密度无关像素)而不是原始像素进行单位,以及如何使用模拟器在多个屏幕尺寸和密度上测试您的应用程序。
编辑:
要设置视图的x和y位置,必须使用LayoutParams。请参阅this question,了解如何使用LayoutParams设置视图的TopMargin和LeftMargin。

谢谢你的帮助,真的很有用。我一直在尝试在相对布局中设置x和y,但是我从来没有成功过。我只是假设边距会随着旁边的元素而变化,而不总是基于父元素的外边缘。我将使用它来尝试我的一些方法,并在一些不同的模拟器上进行测试。我会告诉你结果如何的。 - JBreezy901

3
Android手机有很多不同的形态,不仅屏幕尺寸(2.7英寸、3.2英寸、3.7英寸等)差异很大,分辨率(480X800、480X848等)也是如此。谷歌本身建议不要使用AbsoluteLayout,实际上在新的api版本中已经被弃用了。
下面的链接详细解释了所有这些内容:http://developer.android.com/guide/practices/screens_support.html,请查看最佳实践部分。

谢谢提供链接,它很有帮助。我觉得我的缩放和实现“密度独立性”的方法与他们的方法非常相似。我已经使用了dip和dp,但在所有设备上并不能真正获得我想要的精确比例。除了可以定义x和y位置的布局之外,还有其他的布局吗?“已弃用”是指它在所有设备上都无法工作吗? - JBreezy901
弃用通常意味着有更新和更好的替代方案,可以实现您想要的功能。使用AbsoluteLayout可以工作,但正如我在帖子中所述,您应该使用LinearLayout、GridLayout或RelativeLayout。 - Krøllebølle
我已经尝试过LinearLayout和RelativeLayout,但你无法定义x和y位置。除了Absolute之外,是否有其他方式可以定义x和y位置?期待明天早上阅读您的评论。 - JBreezy901
谢谢您真正回答我的问题。我确实阅读了链接,它很有用。这就是我花费25分钟回复的原因。 - JBreezy901
@JBreezy901,请查看我编辑后的代码,里面有一个类似问题的链接。你需要使用LayoutParams和leftMargin(x值)和rightMargin(y值)参数。LayoutParams适用于所有布局(我想)。 - Krøllebølle

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