Por que o 0dp é considerado um aprimoramento de desempenho?
Aresponda no final desta pergunta foi preenchida, combinando observações e soluções.
QuestãoEu procurei por aí, mas não encontrei nada que realmente explica por queAndroid Lint bem como algunsEclipse sugestões sugerem a substituição de algunslayout_height
elayout_width
valores com0dp
.
Por exemplo, eu tenho umListView
que foi sugerido para ser alterado
Antes
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</ListView>
Depois de
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
Da mesma forma, sugeriu mudanças em umItem ListView. Todos parecem iguais antes e depois das alterações, mas estou interessado em entender por que esses são impulsionadores de desempenho.
Alguém tem uma explicação do porquê? Se isso ajuda, aqui está o layout geral com oListView
.
<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>
RespondaEstou colocando uma resposta aqui porque é realmente uma combinação de respostas e links referenciados abaixo. Se eu estiver errado em alguma coisa, me avise.
DeQual é o truque com 0dip layout_height ou layouth_width?
Existem 3 atributos gerais de layout que funcionam comlargura ealtura
android:layout_height
android:layout_width
android:layout_weight
Quando umLinearLayout
évertical, então olayout_weight
afetará oaltura da criançaView
s (ListView
). Configurando olayout_height
para0dp
fará com que esse atributo seja ignorado.
Exemplo
<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>
Quando umLinearLayout
éhorizontal, então olayout_weight
afetará olargura da criançaView
s (ListView
). Configurando olayout_width
para0dp
fará com que esse atributo seja ignorado.
Exemplo
<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>
A razão para querer ignorar o atributo é que, se você não o ignorou, ele seria usado para calcular o layout que usa mais tempo de CPU.
Além disso, isso evita qualquer confusão sobre a aparência do layout ao usar uma combinação dos três atributos. Isso é destacado por@android developer em uma resposta abaixo.
Além disso,Android Lint eEclipse ambos dizem para usar0dip
. A partir dessa resposta abaixo, você pode usar0dip
, 0dp
, 0px
, etc, já que um tamanho zero é o mesmo em qualquer uma das unidades.
Evite wrap_content no ListView
Se você já se perguntou por quegetView(...)
é chamado tantas vezes como eu tenho, acaba por estar relacionado comwrap_content
.
Usandowrap_content
como eu estava usando acima fará com que toda criançaView
s a ser medido, o que causará mais tempo de CPU. Esta medida fará com que o seugetView(...)
ser chamado. Eu já testei isso e o número de vezesgetView(...)
é chamado é reduzido drasticamente.
Quando eu estava usandowrap_content
em doisListView
sgetView(...)
foi chamado 3 vezes para cada linha em umListView
e 4 vezes para cada linha do outro.
Mudando isso para o recomendado0dp
, getView(...)
foi chamado apenas uma vez para cada linha. Isso é uma grande melhoria, mas tem mais a ver com evitarwrap_content
com umListView
do que o faz0dp
.
No entanto, a sugestão de0dp
melhora substancialmente o desempenho por causa disso.