【问题标题】:Two ways of specifying the height of an android Layout?指定android Layout高度的两种方法?
【发布时间】:2014-05-09 19:06:29
【问题描述】:

我在指定相对布局的高度时遇到问题。据我了解,这两个代码块应该是等价的(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() 时返回该高度。另外,我希望 myLayout 占据一个高度为 70 的矩形及其以前的宽度(恰好是 match_parent)。

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

现在第二个块确实可以工作,尽管我必须运行它两次(!?)才能使更改生效。我在这里严重不知所措,我在文档中找不到与此密切相关的任何内容。

当我昨天出发时,我认为这将是一项容易的任务,但现在我质疑我的理智等等。有什么想法吗?

【问题讨论】:

    标签: android android-relativelayout layoutparams


    【解决方案1】:

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

    在定义参数时设置宽度和高度。如果您希望宽度为match_parent,请像下面这样更改您的代码,它会起作用(如果您不想要 match_parent,只需在下面的代码中设置您想要的宽度):

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                               LayoutParams.MATCH_PARENT, (int)(35*scale));
    myLayout.setLayoutParams(params);
    

    【讨论】:

    • 感谢您的回答,我很高兴地说它有效(也是第一次;))。您是否愿意详细说明这与我的 BLOCK 2 有何不同?在我看来,它们应该是可以互换的?另外,为什么我不能重用旧的 LayoutParams-Object?
    • 很高兴它正在工作 :) 它是不同的,因为您从中获得了 layoutparams 和 height,然后尝试设置该高度。这不会为您提供屏幕上的值,因为您在 onCreate 中调用它并且它还没有准备好获取。这就是为什么我提到如果您想在 onCreate 方法中获取高度,请使用 ViewTreeObserver。
    • 但这些都不在 onCreate() 中。一切都已显示在屏幕上后,只需轻按一个按钮即可完成所有操作。
    • 您的按钮不是在 onCreate 中点击,还是在适配器中调用?还是同样的问题。在您调用特定的 ViewTreeObserver 之前,它不会更新其值。为此使用 ViewTreeObserver 的目的是获取布局中的大小和更改,但对于您当前的示例而言,这并不是必需的。如果您需要绝对值(不是包装或填充),则需要它。从网站检查其目的developer.android.com/reference/android/view/…
    • 更多信息,只需在 onClick 中记录您的 params.width 值(用于您的代码),您会发现它不是您想要的 :) 如果您有 match_parent,它会返回 -1,如果您有 wrap_content,它会返回 -2,它们是这些属性的常量值。
    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2014-11-16
    相关资源
    最近更新 更多