指定android布局高度的两种方法?

指定android布局高度的两种方法?,android,android-relativelayout,layoutparams,Android,Android Relativelayout,Layoutparams,我在指定相对布局的高度时遇到问题。据我所知,这两个代码块应该是等效的(myLayout是我在XML中定义的RelativeLayout,初始高度为“0dp”,其父代码也是RelativeLayout): 第1区: RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams)myLayout.getLayoutParams(); p.height = (int)(35*scale); myLayout.setLayoutParams(p

我在指定相对布局的高度时遇到问题。据我所知,这两个代码块应该是等效的(myLayout是我在XML中定义的RelativeLayout,初始高度为“0dp”,其父代码也是RelativeLayout):

第1区:

RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams)myLayout.getLayoutParams();
p.height = (int)(35*scale);
myLayout.setLayoutParams(p);
myLayout.invalidate();
第2区:

RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams)myLayout.getLayoutParams();
RelativeLayout.LayoutParams newP = new RelativeLayout.LayoutParams(p.width, (int)(35*scale));
myLayout.setLayoutParams(newP);
myLayout.invalidate();
在我的例子中,比例是2。 因此,在执行这两个块中的任何一个之后,我希望myLayout的高度为70,并且在调用myLayout.getHeight()时,我希望它返回该高度。此外,我希望我的布局占据一个矩形,高度为70,以前的宽度为70(恰好是匹配的父项)

但当我运行代码时,第一个块不会更改屏幕上myLayout的高度,也不会更改myLayout.getHeight()的返回值。但是,它确实会更改myLayout.getLayoutParams().height

现在第二个块确实起作用了,尽管我必须运行它两次(!?)才能使更改生效。我在这里真是不知所措,在文档中找不到任何与此密切相关的东西


当我昨天出发的时候,我认为这是一项容易的任务,但是现在我怀疑我的理智,还有其他的事情。有什么想法吗?

如果大小是动态确定的,您可能需要使用ViewTreeObserver获取屏幕上显示的大小

在定义参数时设置宽度和高度。如果您希望宽度为
match\u parent
,请按以下方式更改代码,它将正常工作(如果您不希望match\u parent,请在下面的代码中设置所需的宽度):


谢谢你的回答,我很高兴地说它是有效的(也是第一次)。你能详细说明一下这与我的BLOCK 2有什么不同吗?在我看来,他们应该可以互换?还有,为什么我不能重用旧的LayoutParams对象?很高兴它能工作:)它是不同的,因为您可以从中获取LayoutParams和高度,然后尝试设置该高度。这不会给你屏幕上的值,因为你在onCreate中调用它,它还没有准备好。这就是为什么我提到如果要在onCreate方法中获取高度,请使用ViewTreeObserver,但在onCreate()中没有。这一切都发生在屏幕上的所有内容都显示出来之后,点击一个按钮。您的按钮不是在onCreate中点击,还是在适配器中调用?还是一样的问题。在调用特定的ViewTreeObserver之前,它不会更新其值。使用ViewTreeObserver进行此操作的目的是获取布局中的大小和更改,但对于当前示例来说,这并不是必需的。如果您需要绝对值(而不是包装或填充),则需要该值。从网站上查看更多信息,只需在onClick中记录params.width值(用于代码),您就会看到它不是您想要的:)如果您有match_parent,它将返回-1,如果您有wrap_内容,它将返回-2,这是这些属性的常量值。
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                           LayoutParams.MATCH_PARENT, (int)(35*scale));
myLayout.setLayoutParams(params);