以编程方式调整视图大小取决于Android版本?

时间:2010-10-24 12:52:27

标签: android layout

我面临着关于这个主题的奇怪行为。

我有一个非常简单的布局,只包含一个空的 RelativeLayout

一旦我从用户输入,这个相对布局就会用方形瓷砖填充,以达到类似马赛克的效果。每个图块由包含两个图像的FrameLayout制作(在任何给定时间只绘制一个图像)。我不可能将贴图放在XML布局中,因为我事先并不知道我需要多少贴图。

在我的相对布局的 onSizeChanged 中,我强制在所有切片上调整大小以适应新的大小。

代码是这样的:

public void resizeTiles(int w, int h) {
    int l1 = w / X; int l2 = h / Y;
    int tileS = (l1 <= l2 ? l1 : l2);
    android.view.ViewGroup.LayoutParams lp;
    for (Tile t : myTiles) {
        lp = t.getLayoutParams();
        lp.width = tileS;
        lp.height = tileS;
    }
}

在我的清单文件中,我有以下内容:

<uses-sdk 
    android:minSdkVersion="4"
    android:targetSdkVersion="4"
/>

因此,目标系统是1.6。

到目前为止一切都那么好,这就像一个魅力......但仅限于2.2。

放置在模拟器2.1-update1或之前的相同二进制文件给我一个空的布局(我也尝试了几个物理设备,结果相同)。

调试,我跟踪问题是在调整大小;评论宽度和高度分配我看到了瓷砖,但比例扭曲。

有关如何使其正常工作的任何建议吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

一旦确定了最终大小,就会在布局过程的后期调用

onSizeChanged()。此时可能已经有一些布局过程在层次结构中发生。

基本答案是:布局参数用于告诉视图的父级,其布局参数之前执行布局。如果它们发生变化,则必须使布局无效,以使用新参数执行新的完整布局。你永远不应该在布局中间更改这些。

最好的办法就是编写自己的布局管理器。 (如果你正在做瓦片的布局,那么RelativeLayout会做一些你不需要的东西 ton ,这使它的效率大大低于必要。)编写一个简单的布局实际上并不是很难管理器。

您可以使用框架中的简单布局管理器作为指南:

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/AbsoluteLayout.java

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/FrameLayout.java

(请注意,即使这些都比您可能需要的要复杂得多,因为它们是用于实现它们的布局的通用目的。我们真的应该有一个真正简单的自定义布局的API演示。)