关于了解布局单元

Regarding understanding the layout units

我正在计算 ListView 中某些项目的高度,然后以编程方式将计算出的高度分配给 ListView,以确保 ListView 将扩展以容纳其内容。我计算了 ListView 中项目的高度,如下面的代码所示。

如代码所示,下面一行returns一个值等于533:

height += listView.getDividerHeight() * listView.getCount();// 

我遇到的问题是,当 ListView 的高度设置为代码中显示的返回值“533”时,ListView 与其内容的高度完全相同。但是当我为 ListView 设置相同的值“533”时 "android:layout_height" 在 XML 文件中,然后 ListView 超出其内容 "higher than its contents"

所以我的问题是:

  1. 请解释为什么会这样?

  2. 至于发布的代码,当我将 'TypedValue.COMPLEX_UNIT_DIP' 更改为 'TypedValue.COMPLEX_UNIT_PX' 等任何其他单位时,根本没有任何变化。为什么更改LayoutParameter的单位没有效果?

代码:

int height = 0;
for (int i = 0; i < listView.getCount(); i++) {
    View childView = listView.getAdapter().getView(i, null, listView);
    childView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    height+= childView.getMeasuredHeight();
}
//dividers height
height += listView.getDividerHeight() * listView.getCount();// returns 533

param = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, this.getResources().getDisplayMetrics()));
param.addRule(RelativeLayout.BELOW, ruleSubject);
container.setLayoutParams(param);
listView.requestLayout();

1-请解释为什么会这样?

在 .xml 布局文件中,您正在使用 dp 中的值。而计算出的值533是533px。所以在布局xml文件中使用

android:layout_height="533px"

你会得到相同的结果。

首先,您需要了解尺码 here。它说

The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application's UI, to ensure proper display of your UI on screens with different densities.

1-please explain why that is happening?

那是因为这些像素是如何呈现的。当你在 XML 中执行它时,它是 静态 渲染,当你在 Java 中执行它时,它是 动态 渲染。

2-至于发布的代码,当我将 'TypedValue.COMPLEX_UNIT_DIP' 更改为 'TypedValue.COMPLEX_UNIT_PX' 等任何其他单位时,根本没有任何变化。为什么改变layoutParameter

的单位没有效果

ans: return 值将以 px 为单位。