关于理解布局单位

时间:2016-12-10 10:42:05

标签: android android-layout view android-linearlayout relativelayout

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

如代码所示,以下行返回一个等于533的值:

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

我遇到的问题是,当ListView的高度设置为代码中显示的返回值“533”时,ListView与其内容具有完全相同的高度。但是当我将相同的值“533”设置为ListView时 在XML文件中的“android:layout_height”中,ListView的内容扩展得超出了“高于其内容”的内容

所以我的问题是:

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

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

  3. 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();
    

3 个答案:

答案 0 :(得分:0)

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

在.xml布局文件中,您正在使用dp中的值。计算值533为533px。因此在布局xml文件中使用

android:layout_height="533px"

你会得到相同的结果。

答案 1 :(得分:0)

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

  

dp单位到屏幕像素的转换很简单:px = dp *(dpi / 160)。例如,在240 dpi屏幕上,1 dp等于1.5个物理像素。在定义应用程序的UI时,应始终使用dp单位,以确保在不同密度的屏幕上正确显示UI。

     

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

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

答案 2 :(得分:0)

2 - 对于发布的代码,当我更改&#39; TypedValue.COMPLEX_UNIT_DIP&#39;任何其他单位,如&#39; TypedValue.COMPLEX_UNIT_PX&#39;根本没有变化。为什么更改layoutParameter的单位没有效果

ans:返回值将以px为单位。

enter image description here

enter image description here

enter image description here