已填写此问题末尾的答案,结合评论和解决方案。
问题
我四处搜索,但没有找到任何真正解释为什么Android Lint以及一些Eclipse提示建议用.layout_height
layout_width
0dp
例如,我有一个ListView
建议更改
前
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</ListView>
后
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
同样,它建议对ListView item进行更改。这些在更改前后看起来都一样,但我有兴趣了解为什么这些是性能提升器。
任何人都可以解释为什么?如果有帮助,这里是ListView
.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/logo_splash"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ImageView>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@color/background"
android:layout_below="@id/logo_splash">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
<TextView
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_upcoming" />
</LinearLayout>
</RelativeLayout>
回答
我在这里输入答案,因为它实际上是答案和下面引用的链接的组合。如果我在某件事上错了,请告诉我。
来自0dip layout_height 或 layouth_width 的诀窍是什么?
有 3 个通用布局属性适用于宽度和高度
android:layout_height
android:layout_width
android:layout_weight
当 aLinearLayout
为垂直时,layout_weight
将影响孩子s ( )的高度。设置为将导致该属性被忽略。View
ListView
layout_height
0dp
例子
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
</LinearLayout>
当 aLinearLayout
为水平时,layout_weight
将影响子s ( )的宽度。设置为将导致该属性被忽略。View
ListView
layout_width
0dp
例子
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<ListView
android:id="@android:id/list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
</ListView>
</LinearLayout>
要忽略该属性的原因是,如果您不忽略它,它将用于计算使用更多 CPU 时间的布局。
此外,这可以防止在使用这三个属性的组合时对布局的外观产生任何混淆。@android 开发人员在下面的答案中强调了这一点。
此外,Android Lint和Eclipse都说使用0dip
. 从下面的答案中,您可以使用0dip
、0dp
、0px
等,因为任何单位中的零大小都是相同的。
避免在 ListView 上使用 wrap_content
如果您曾经想知道为什么getView(...)
像我一样多次调用它,结果证明与wrap_content
.
像我上面使用wrap_content
的那样使用会导致测量所有 child View
,这将导致更多的 CPU 时间。此测量将导致您getView(...)
被调用。我现在已经对此进行了测试,并且getView(...)
调用的次数大大减少了。
当我wrap_content
在两个ListView
s上使用时getView(...)
,每行调用 3 次,每行调用ListView
4 次。
将此更改为推荐的0dp
,getView(...)
每行仅调用一次。这是一个相当大的改进,但更多的是避免wrap_content
使用 aListView
而不是0dp
.
但是,0dp
由于这个原因,建议确实大大提高了性能。