关于理解布局单位
Posted
技术标签:
【中文标题】关于理解布局单位【英文标题】:Regarding understanding the layout units 【发布时间】:2016-12-10 10:42:05 【问题描述】:我正在计算 ListView 中某些项目的高度,然后我以编程方式将计算出的高度分配给 ListView,以确保 ListView 将扩展以适应其内容。我计算了 ListView 中项目的高度,如下代码所示。
如代码所示,下面一行返回一个等于533的值:
height += listView.getDividerHeight() * listView.getCount();//
我遇到的问题是,当 ListView 的高度设置为返回值“533”时,如代码所示,ListView 的高度与其内容完全相同。但是当我将相同的值“533”设置为 ListView 在整个 XML 文件中的“android:layout_height”中,ListView 扩展太多超出其内容“高于其内容”
所以我的问题是:
请解释为什么会这样?
至于发布的代码,当我将“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】:1-请解释为什么会这样?
在 .xml 布局文件中,您使用的是 dp
中的值。而计算出来的值533是533px
。所以在layout xml文件中使用
android:layout_
你会得到同样的结果。
【讨论】:
很好..但是当我将计算值“522”转换为 dpi 时得到 266......当我以编程方式设置 claculated dp 值时,如代码所示......我得到一个非常小的列表视图高度,即使我以编程方式在代码中指定了正确的单位 以编程方式,您必须在 px 中提供它。将值转换为 px。您将得到相同的结果。对于转换,请检查上述答案 我认为你的转换是错误的。检查最后一个答案。希望它有帮助!!!【参考方案2】:首先,您需要了解尺寸here。它说
dp 单位到屏幕像素的转换很简单:px = dp * (dpi / 160)。例如,在 240 dpi 的屏幕上,1 dp 等于 1.5 个物理像素。在定义应用程序的 UI 时,您应该始终使用 dp 单位,以确保您的 UI 在不同密度的屏幕上正确显示。
1-请解释为什么会这样?
那是因为这些像素是如何渲染的。当您在 XML 中执行此操作时,它会以 静态方式 呈现,而当您在 Java 中执行此操作时,它会以 动态方式 呈现。
【讨论】:
【参考方案3】:2-至于发布的代码,当我将“TypedValue.COMPLEX_UNIT_DIP”更改为任何其他单位(如“TypedValue.COMPLEX_UNIT_PX”)时,根本没有任何变化。为什么改变layoutParameter的单位没有效果
ans:返回值将以 px 为单位。
【讨论】:
以上是关于关于理解布局单位的主要内容,如果未能解决你的问题,请参考以下文章