结合了备注和解决方案,在此问题末尾的答案已经填写完毕。
题
我四处搜寻,但没有找到任何能真正解释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项进行更改。这些更改前后的外观都相同,但是我有兴趣了解为什么这些是性能提升的原因。
有人对此有解释吗?如果有帮助,请使用进行总体布局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
当一个LinearLayout
是垂直的,那么layout_weight
将影响身高的孩子的View
S( 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
像我上面使用的那样使用,将导致所有childView
都被测量,这将导致更多的CPU时间。此测量将导致您getView(...)
被呼叫。我现在已经对此进行了测试,并且getView(...)
被调用的次数大大减少了。
当我wrap_content
在两个ListView
s上使用时,getView(...)
在一行中每行被调用3次,在另一行中被调用ListView
4次。
将其更改为建议的0dp
,getView(...)
每行仅调用一次。这是一个很大的改进,但是与避免wrap_content
使用aListView
相比,它有更多的作用0dp
。
但是,因此的建议0dp
确实可以显着提高性能。