2010-10-24 42 views
0

我正面临着一个关于这个问题的奇怪行为。以编程方式调整视图大小取决于Android版本?

我有一个非常简单的布局,只包含一个空的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或之前的相同二进制文件给我回空布局(我也尝试了几个物理设备,结果相同)。

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

任何有关如何使这项工作的建议?

在此先感谢。

回答

3

一旦确定了最终尺寸,onSizeChanged()在布局过程中被称为后期。在这一点上,可能已经有一些布局传递发生在层次结构中。

基本答案是:布局参数是告诉视图的父母它的布局参数之前正在执行布局。如果它们发生变化,则布局必须失效才能使用新的参数执行新的完整布局。你不应该在布局中改变它们。

要做的最好的事情就是编写自己的布局管理器。 (如果你正在做瓷砖布局,RelativeLayout会做更多你不需要的东西,使其效率低于必要的程度。)编写简单的布局管理器其实并不困难。

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

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演示。)

相关问题